Apollo 客户端:cache.modify 不起作用?

Posted

技术标签:

【中文标题】Apollo 客户端:cache.modify 不起作用?【英文标题】:Apollo Client: cache.modify does not work? 【发布时间】:2020-10-12 01:44:51 【问题描述】:

我似乎无法在突变后更新我的缓存,尽管我传递了类型名和 id 来引用要修改的对象。我究竟做错了什么? 我在这里复制了一个简单的例子。

我首先用数据初始化了我的缓存 -

const writeInitialData = () => 
    cache.writeQuery(
        query: gql`
            query 
                test
            
        `,
        data: 
            test: 
                __typename: 'test',
                id: 'id1',
                string: 'initial string',
            
        ,
    );
;

然后我在我的客户端上执行了突变。

updateTest: (_, __,  cache ) => 
    cache.modify(
      id: cache.identify(
        __typename: 'test',
        id: 'id1',
      ),
      fields: 
        string: 'changed string',
      ,
    );

但是,缓存中的值并没有改变,而且如果我 console.log() 得到 cache.modify 的返回值,它给了我false,表示缓存没有更新。

【问题讨论】:

【参考方案1】:

在 Apollo 客户端 v3 中,您可以使用 [cache.modify][1] 的新方法:

 update: (cache,  data ) => 
        // Update cache with modify method
        cache.modify(
          fields: 
            authorization(existingAuth = [],  readField ) 
              return existingAuth.filter(
                (rule) =>
                  readField('id', rule) !== data.id,
              );
            ,
          ,
        );
      ,
    授权是一个修饰函数。 readField 是一个实用函数。 _id 是缓存中自己的标识符。 existingAuth 是 __refs 的列表。

【讨论】:

【参考方案2】:

您应该使用mutation 来更新缓存。试试这个:

...
const resolvers = 
  Mutation: 
    updateTest: (_, args ,  cache ) => 
      const  test  = cache.readQuery(
                query: gql`
                query 
                    test
                
            `,
            )
      cache.writeData(
          data: 
            test: ...test, args.string
          ,
      )
  


...
const client = new ApolloClient(
  cache,
  link,
  resolvers,
)

【讨论】:

以上是关于Apollo 客户端:cache.modify 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 客户端不显示错误消息

转 apollo客户端实现不重启项目动态获取配置

Apollo 客户端持久缓存不起作用

Apollo 客户端片段不嵌入数据

Apollo 客户端:缓存更新后组件不呈现(反应变量)

Apollo 客户端未在 Nextjs Lamda 中发送 JWT 不记名令牌