2016-05-12 61 views
6

我正试图为登录实现突变。突变验证提供的id_token并通过会话记录用户。这个突变本身是有效的(通过GraphiQL验证),但是我遇到了与Relay的整合问题。中继/路由器登录突变?

当用户登录时,由于“查看器”是根查询,整个中继商店可能会被更改。但我不想在胖查询中列出我的整个查询树。能够以某种方式清除整个商店会很好,但我没有看到用react-router-relay这样做的方法。

继电器突变:

export default class LoginMutation extends Relay.Mutation { 
    getMutation() { 
    return Relay.QL`mutation {login}`; 
    } 

    getVariables() { 
    return { 
     id_token: this.props.id_token 
    }; 
    } 

    getFatQuery() { 
    // TODO: list everything? 
    return Relay.QL` 
     fragment on LoginPayload { 
     viewer 
     } 
    `; 
    } 

    getConfigs() { 
    return []; // TODO: not sure what to return... 
    } 
} 

用法:

Relay.Store.commitUpdate(new LoginMutation({id_token}), { 
     onSuccess: (resp) => { 
      history.push('/'); 
     } 
     }); 

GraphQL模式:

input LoginInput { 
    id_token: String! 
    clientMutationId: String! 
} 

type LoginPayload { 
    viewer: Viewer 
    clientMutationId: String! 
} 

type Mutation { 
    login(input: LoginInput!): LoginPayload 
} 

interface Node { 
    id: ID! 
} 

type Query { 
    viewer: Viewer 
    node(id: ID!): Node 
} 

type Viewer implements Node { 
    id: ID! 
    user: User 
    ships: [Ship] 
    ship(id: ID!): Ship 
} 

schema { 
    query: Query 
    mutation: Mutation 
} 
+0

Relay的版本[v0.8.0](https://github.com/facebook/relay/releases/tag/v0.8.0)引入了'Relay.Environment',您可以实例化并将该实例传递给'Relay .Renderer'。尚未记录。看看这个github问题的最后几条评论:[Implement RelayStore.reset()](https://github.com/facebook/relay/issues/233)。 –

回答

0

fatQuery,当你列出一个non-scalar场,接力将假设任何连接字段可能有你pdated。在某些需要参数的字段中(例如,(first: n)),可以使用@relay(pattern: true)来绕过此要求。 This SO question讨论了该功能。