React Apollo:添加新项目时,更新列出缓存(带有变量)

时间:2019-02-04 18:49:44

标签: reactjs react-apollo apollo-client apollo-cache-inmemory

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

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

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

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

3 个答案:

答案 0 :(得分:2)

这是一个已知的Apollo问题,团队正在努力解决。您可以在in this medium post中找到当前的选项。

当您将项目包含在具有过滤器或分页的列表中时,这也是删除/更新项目的问题。

这里是an opened issue on Github about it

的引用

答案 1 :(得分:0)

这似乎可行,但是访问cache.watches Set有点笨拙吗? :S

诀窍是访问给定查询的缓存变量,将其保存并使用给定查询变量执行refetch。就我而言,创建项目后:

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 [];
}

在update和refetchQueries函数中,应该可以访问variables变量

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

答案 2 :(得分:0)

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