我正在尝试更新中继商店中当前查看器的值和连接。
因此,如果我打印,则不调用变异signIn:
console.log(viewer.name) // "Visitor"
console.log(viewer.is_anonymous) // true
在Mutations上我们得到了方法更新器,它给了我们商店,所以在我的变异中我做的是这样的:
mutation SignInMutation($input: SignInInput!){
signIn(input: $input){
user {
id
name
email
is_anonymous
notifications{
edges{
node {
id
...NotificationItem_notification
}
}
}
}
token
}
}
所以我的更新程序方法有:
const viewer = store.get(viewer_id);
const signIn = store.getRootField('signIn');
viewer.copyFieldsFrom(signIn.getLinkedRecord('user'))
在此之后我更新了商店我得到了名称电子邮件is_anonymous字段更新了来自graphql端点的数据(我的意思是现在名字是“Erick”,is_anonymous现在是假的,这很棒)但是如果我尝试做viewer.notifications并渲染它,即使有通知,viewer.connections的长度似乎也是0。
如何更新当前查看器并将MutationPayload中的通知添加到商店中而无需强制获取?
我正在使用最新的relay-modern和graphql。
PS:对不好的形成感到抱歉,但是按照OF要我的方式格式化代码是不可能的,我把它格式化为4个空格并且仍然给了我错误。答案 0 :(得分:0)
通过重新组织GraphQL模式,可能会消除登录突变后直接与中继存储进行交互的需要。考虑:
viewer {
id
currentUser {
name
email
}
}
当没有登录的用户时,currentUser
将返回null
。
然后您可以将登录突变修改为:
mutation SignInMutation($input: SignInInput!){
signIn(input: $input){
viewer {
id
currentUser {
name
email
token
}
}
}
}
了解currentUser
字段的“可空性”为确定用户是否登录提供了一种优雅的方法。
基于token
字段的存在表示您正在使用JWT或类似的方法来跟踪登录状态。您需要将该令牌存储在本地存储中,并将其附加到GraphQL端点的传出中继请求的标头中。
令牌本身的存储必须在发出突变请求的onCompleted
回调中完成(您可以在回调函数的参数中访问服务器返回的有效负载)。
作为令牌的替代方法,您还可以探索使用cookie,该cookie可以提供相同的用户体验,但是与JWT令牌相比,可能需要更少的工作。