变异后的Apollo缓存未更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变异后的Apollo缓存未更新相关的知识,希望对你有一定的参考价值。

Apollo缓存在突变后没有更新,我不想手动访问缓存,因此无法使用writeQuery和readQuery方法来更新缓存。使用readQuery和writeQuery的update方法正在更新缓存,但是这不是我想要的方式。我希望它自动更新。我也使用了refetchQueries,调用了API,并从服务器获取了新数据作为响应,但是它没有更新缓存,并且缓存中仍然有旧数据。在执行了突变后,我打电话给查询来获取新数据,但是它从缓存中返回了过时的数据。 fetch-policy是缓存和网络。这是我希望工作的方式:执行变异后,我将向服务器调用查询以获取新数据,它应使用新数据更新缓存。

async deleteFamilyMember () 
      await this.$apollo
        .mutate(
          mutation: DELETE_FAMILY_MEMBER,
          variables: 
            familyMemberId: this.memberToDelete
          
        )
        .then(response => 
          this.getFamilyMembers()
        )
        .catch(err => console.log(err))
    

 async getFamilyMembers () 
      await this.$apollo
        .query(
          query: FAMILY_MEMBERS
        )
        .then(response => 
          this.familyMembers = response.data.familyMembers
          this.$store.commit('SET_FAMILY_MEMBERS', response.data.familyMembers)
        )
        .catch(err =>
          console.log('Error fetching family members details', err)
        )
    
答案

而不是使用this。$ apollo.query(),而是使用this。$ apollo.watchQuery(),watchQuery方法返回一个QueryRef对象,该对象的value changes属性为Observable。当查询完成时,observable将仅发出一次,并且除非您将watchQuery参数notifyOnNetworkStatusChange设置为true,否则加载将设置为false。查询完成后,它还将包含一个数据对象。因此,如果其他查询获取新信息,则此组件将更新以保持一致。有关更多信息,请阅读docs

      await this.$apollo
        .watchQuery(
          query: FAMILY_MEMBERS
        )
        .subscribe(
          next: ( data ) => 
            console.log("DATA", data);
            this.familyMembers = data.familyMembers;
            this.$store.commit(SET_FAMILY_MEMBERS, data.familyMembers);
          ,
          error: e => console.error("Error fetching family members details", e)
        );
    

以上是关于变异后的Apollo缓存未更新的主要内容,如果未能解决你的问题,请参考以下文章

更新 apollo 缓存而不调用 graphql 服务器(apollo v3.3)

使用以未定义缓存状态结尾的 apollo-cache-persist 和 apollo-link-state

查询后如何更新 Apollo 缓存?

Apollo / GraphQl - 单实体突变不更新缓存(数据库更新)

在 GraphQL/Apollo 中使用带有变异查询的 Promise?

为啥我的 Apollo 缓存更新没有反映在我的查询中?