问题描述
我正在开发一个应用程序,其中有带有嵌套资产树的项目。在后端,当孙子(或孙子)之一被更新时,项目的更改日期也会更新。
在react-apollo中,我设置了所有查询,以便返回更新的对象,并使用更新的数据更新apollo的缓存。但是我还想更新项目的更改日期(可能是父母,祖父母等)。
一种解决方案是使用refetchQueries选项。但是,这意味着我需要在使用useMutation钩子的所有代码中都实现此refetchQueries选项,这会导致大量代码重复以及其他开发人员(4人一组)可能忘记它的风险。更好的选择是创建一个包装useMutation钩子的自定义钩子,但开发人员仍然需要使用它。
所以我现在正在考虑为此使用apollo-link,这将影响执行的所有突变。但是,我无法确定是否可以向操作中添加查询或对查询进行排队,以及如何进行?
感谢您的帮助!
解决方法
使用ApolloLink,您可以生成链接的afterware
来解析返回的响应,并在适当情况下有条件地更新缓存。
import { ApolloLink } from "apollo-link";
import { createHttpLink } from "apollo-link-http";
const httpLink = createHttpLink({ uri: "/graphql" });
const updateDateCacheLink = new ApolloLink((operation,forward) => {
return forward(operation).map(response => {
const context = operation.getContext();
const { response: { headers } } = context;
/* conditionally update cache */
return response;
});
});
// use with apollo-client
const link = updateDateCacheLink.concat(httpLink);
或者,您可以考虑使用HOC返回实现update
的{{1}}回调的组件,该组件接收更新有效负载。这样可以避免重复,并封装与您的请求一致的通用缓存逻辑。正如您所指出的,自定义钩子可以包装并代替useMutation(以下未显示)使用。
useMutation