1

我很难弄清楚如何更新项目列表(在缓存中)。当使用 . 创建新项目时react-apollo

<CreateItemButton />组件(在我的情况下)没有嵌套在<ListItems />组件中。据我所知,我需要通过我的 createItemButton<Mutation />组件中的更新函数来更新缓存。

问题是当我尝试store.readQuery({query: GET_LIST_ITEMS, variables: ???})获取当前项目列表(以附加我最近创建的项目)时,这可能有变量/过滤器(用于分页、排序等)。

我怎么知道要传递给store.readQuery函数的变量,是否有一种“最后使用的变量”,或者你对如何解决这个问题有任何其他建议?

4

3 回答 3

2

这是一个已知的 Apollo 问题,团队正在努力解决。您可以在此中型帖子中找到您当前的选项。

当您将项目放在带有过滤器或分页的列表中时,删除/更新项目也是一个问题。

这是Github 上关于它的已打开问题的参考

于 2019-02-04T20:21:16.437 回答
0

这似乎可行,但访问cache.watches Set? :S

诀窍是访问给定查询的缓存变量,保存它并使用给定的查询变量执行重新获取。就我而言,在创建项目后:

export const getGraphqlCacheVariables = (queryName, cache) => {
  if (cache.watches) {
    const watch = [...cache.watches].find(w => !!w.query[queryName]);

    if (watch) {
      return watch.variables;
    }
  }
};

mutation update功能:

let variables;

const update = (cache, { data }) => {
  if (data && data.createTask && data.createTask.task) {
    variables = getGraphqlCacheVariables('GetTasks', cache);
  }
}

refetchQueries功能:

const refetchQueries = () => {
      if (variables && Object.keys(variables).length > 0) {
        return [{ query: GET_TASKS, variables }];
      }
      return [];
}

Bot update 和 refetchQueries 函数应该可以访问variables变量

与Medium 文章 中的解决方案相比的好处是,您不会删除具有不同变量的给定查询 (GET_TASKS) 的缓存数据。

于 2019-02-06T13:25:14.113 回答
0

Apollo 现在提供了一个新指令,允许在查询缓存时忽略一些变量。在这里检查。我用它来忽略我不断变化的分页参数。

于 2020-03-27T16:28:13.760 回答