首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用readQuery和writeQuery从阿波罗readQuery客户端删除缓存记录

如何使用readQuery和writeQuery从阿波罗readQuery客户端删除缓存记录
EN

Stack Overflow用户
提问于 2020-10-14 00:21:07
回答 1查看 514关注 0票数 0

阿波罗GraphQL团队说,readQuery和writeQuery对95%的用例都很好。我正在使用useMutationupdate,并且希望在不需要调用refetchQueries的情况下从缓存中删除一个项。我的代码如下:

代码语言:javascript
复制
const [deleteSpeaker] = useMutation(DELETE_SPEAKER, {
  update(cache, { data: {deleteSpeaker}}) {
    const { speakers} = cache.readQuery({query: GET_SPEAKERS});
    cache.writeQuery({
      query: GET_SPEAKERS,
      data: { speakers: speakers.filter(speaker => speaker.id !== deleteSpeaker.id) }
    });
  },
});

从readQuery返回的内容使我认为我应该对speakers.datalist进行过滤,但是当我这样做时,缓存不会更新。

更新缓存以反映从GET_SPEAKERS查询中删除的记录的正确方法是什么。

代码语言:javascript
复制
export const DELETE_SPEAKER = gql`
      mutation DeleteSpeaker($speakerId: Int!) {
        deleteSpeaker(speakerId: $speakerId) {
          id
          first
          last
          favorite
        }
      }
    `;

和GET_SPEAKERS

代码语言:javascript
复制
export const GET_SPEAKERS = gql`
  query {
    speakers {
      datalist {
        id
        first
        last
        favorite
        company
      }
    }
  }
`;
EN

回答 1

Stack Overflow用户

发布于 2022-08-09 06:24:48

阅读阿波罗博士,这应该是类似的东西:

代码语言:javascript
复制
const [deleteSpeaker] = useMutation(DELETE_SPEAKER, {
  update(cache, { data: {deleteSpeaker}}) {
    cache.modify({
      id: cache.identify(deleteSpeaker.id),
      fields: {
        comments(existingSpeakerRefs, { readField }) {
          return existingSpeakerRefs.filter(
            speaker => deleteSpeaker.id !== readField('id', speakerRef)
          );
        },
      },
    });
  },
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64344886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档