使用apollo-link可以获取任何突变的查询

问题描述

我正在开发一个应用程序,其中有带有嵌套资产树的项目。在后端,当孙子(或孙子)之一被更新时,项目的更改日期也会更新。

在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