【问题标题】:Is it necessary to use 'writeFragment' while updating cache after a mutation?突变后更新缓存时是否需要使用“writeFragment”?
【发布时间】:2020-12-19 21:47:31
【问题描述】:

所以我正在从 apollo 客户端文档中学习突变,并且在执行突变后我遇到了更新客户端缓存。是否有必要使用这里描述的 writeFragment:https://www.apollographql.com/docs/react/data/mutations/#making-all-other-cache-updates

因为我可以通过扩展现有数组并添加更新函数返回的“addTodo”对象来做同样的事情(至少我对 redux 是这样做的)

我的更新函数如下所示:

update(cache, { data: { addTodo } }) {
      cache.modify({
        fields: {
          todos(existingTodos = []) {
            return [...existingTodos, addTodo];
          }
        }
      });
    }

我错过了什么吗?

【问题讨论】:

  • 同理需要——更新依赖同一个数据源的其他组件(查询结果)
  • @xadm,是的,我理解使用更新功能背后的目的。我的问题是关于使用片段而不是直接传播数组并添加新的对象,因为它同样有效:)
  • 缓存突变(子项/子属性)并不总是影响整个查询的缓存条目,组件不会被重新渲染...... writeQuery/writeFragment 就是为了这个
  • 对于任何混淆,我深表歉意,但他们正在重新渲染,没有任何问题。文档还说,目标字段的缓存会更新为我们为修饰符设置的任何返回值。请让我知道是否有助于在codeandbox上分享示例代码供您查看。
  • 我相信它有效,这是非常基本的用例......在更复杂的情况下它可能会失败......请记住未来......如果某些带有查询的组件在突变后没有重新呈现,然后检查缓存更新方法。

标签: graphql apollo-client


【解决方案1】:

writeQuerywriteFragment 一样,modify 会触发所有依赖于修改字段的活动查询的刷新(除非您覆盖此行为)。

writeQuerywriteFragment 不同,modify 会绕过您定义的任何合并函数,这意味着字段总是会被您指定的值覆盖。

您还可以使用writeFragment 添加新字段。

client.writeFragment({
  id: '5',
  fragment: gql`
    fragment myTodo on Todo {
      completed
    }
  `,
  data: {
    completed: true,
  },
});

参考:https://www.apollographql.com/docs/react/caching/cache-interaction/#cachemodify 参考:https://github.com/apollographql/apollo-client/issues/6922

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 2020-05-09
    • 2021-01-03
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2021-10-06
    相关资源
    最近更新 更多