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删除
!谢谢!