Graphql 缺失突变的乐观更新
我正在写一篇文章。变异应该删除一个Graphql 缺失突变的乐观更新,graphql,relayjs,Graphql,Relayjs,我正在写一篇文章。变异应该删除一个Key节点并更新viewer的keys集合(我使用的是中继式集合:viewer{keys(first:3){edges{node{…}}}) 按照建议,为了简单起见,我正在使用字段\u CHANGE配置,它实际上正在工作: export class DeleteKeyMutation extends Relay.Mutation { static fragments = { viewer: () => Relay.QL` fragm
Key
节点并更新viewer
的keys
集合(我使用的是中继式集合:viewer{keys(first:3){edges{node{…}}}
)
按照建议,为了简单起见,我正在使用字段\u CHANGE
配置,它实际上正在工作:
export class DeleteKeyMutation extends Relay.Mutation {
static fragments = {
viewer: () => Relay.QL`
fragment on Viewer { id }
`,
};
getMutation() { return Relay.QL`mutation {deleteKey}`; }
getVariables() {
return {
id: this.props.id,
};
}
getFatQuery() {
return Relay.QL`
fragment on DeleteKeyPayload {
viewer { keys }
}
`;
}
getConfigs() {
return [
{
type: 'FIELDS_CHANGE',
fieldIDs: {
viewer: this.props.viewer.id,
},
},
];
}
}
现在,我应该如何为此编写乐观变异?我尝试了不同的方法,但都没有成功。中继中的乐观更新只是模拟如果操作成功服务器将返回什么。在您的情况下,您删除了一个键,这意味着结果将是一个没有该键的对象
getOptimisticUpdate() {
return {
viewer: {
id: this.props.viewer.id,
keys: {
edges: this.props.viewer.keys.edges.filter((keyEdge) => key.node.id !== this.props.id)
}
}
};
}
您还需要包含片段的密钥,以便它们在突变中可用
static fragments = {
viewer: () => Relay.QL`
fragment on Viewer { id, keys { edges(first: 3) { node { id } }}
`,
};
这个方法的问题在于它依赖于你的突变来知道你当前的密钥分页。如果你同时在整个连接上运行,它是好的,但是如果你使用的是中继分页,你应该考虑使用其他的变异操作。
有一个
NODE\u DELETE
,它可以从中继存储中删除所有出现的密钥,或者您可以使用RANGE\u DELETE
仅从当前连接中删除它。不幸的是,这个解决方案似乎不起作用:1)我相信突变片段中有一个输入错误,应该是{id,keys{edges(首先…
;2)添加乐观更新时会出现警告:警告.js:44警告:RelayQueryWriter:找不到记录的类型名
Vmlld2VyOm1l
(如果我在乐观响应中添加类型名:'Viewer'
,它将消失);3)不幸的是,没有发生更新。我是否应该就此提出问题?我成功地为更新突变编写了乐观响应,但不是为删除突变编写了乐观响应。调试一步一步地进行,我发现RelayQueryWriter在乐观更新中没有调用\u writeConnection()
(与最终更新中一样),而是调用\u writeLink()keys
字段上的。显然,查询中keys
字段的元数据有isConnection:false
,知道为什么吗?很有趣。我不知道为什么不应用它。我想在这种情况下,您需要添加'RANGE\u DELETE'或'NODE\u DELETE'配置来进行这种变异。好吧,最后我成功地做到了使用节点\u删除!谢谢!