当前位置: 首页 > 知识库问答 >
问题:

为什么react应用程序中的“自动存储更新”在客户端存储上不起作用?

柴阳云
2023-03-14

我正在使用react-apollo在我的反应应用程序中管理客户端存储,因此没有后端图形化服务器。与apollo相关的所有内容都在客户端运行。我将所有UI状态存储在ApolloClient的缓存中。我还在客户端定义了所有解析器。

以下是新建客户端实例的代码:

new ApolloClient({
    cache,
    resolvers: {
      Mutation: {
        ...cartResolvers,
      },
    },
    typeDefs: [typeDefs]
  });

我读过这篇文章https://www.apollographql.com/docs/angular/features/cache-updates/#automatic-存储更新关于使用apollo graphql变异和查询中的ID自动更新存储。但它似乎不起作用。我有以下疑问和变异:

export const queryCart = gql`
  {
    cart @client {
      items {
        id
        name
        price
        quantity
        image
      }
    }
  }
`;

export const addToBasket = gql`
  mutation addToBasket($sku: ID!) {
    addToBasket(id: $sku)  @client {
      items {
        id
        name
        price
        quantity
        image
      }
    }
  }
`;

我已经为该突变定义了解析器addToBasket

const addToBasket = (_parent: any, item: { id: string }, { cache }: ResolverCacheType): CartProps => {
   ...
   return {
      items: [ {id, name, price, quantity, image } ]
   }
}

我发现,即使我在解析器中返回id,缓存也不会更新,查询也不会反应。我可以通过手动更新resolve by缓存中的缓存数据来实现。写入数据。

共有1个答案

公羊招
2023-03-14

您的用例与react apollo提供的自动更新场景不同:您运行的变异不会更新项目本身。相反,它会更新一个未以任何方式设置关键帧的数组,以便“react apollo”跟踪其更改。

要利用自动更新功能,可以将项数组的数据结构从现在的简单数组更改为类似以下内容的对象:

{ _id, [{id, name, price, ...}]}

查询和变异都应返回此对象。然后,您的设置与文档中的示例相同。突变运行后,返回对象与本地缓存具有相同的id,因此,react apollo知道它需要更新缓存数据。

或者,您可以手动使用cache.writeData,正如您已经提到的,或者使用refetchQueries来更新购物车项目数组。

 类似资料:
  • 我有一个简单的存储过程,在我创建的表上执行。当我使用硬编码参数单独执行update语句时,它可以工作,但过程在执行时不会更新。它返回一个“命令已成功完成”,但不影响任何行。我检查了数据,数据也没有变化。

  • 客户端存储

  • 我有一个React组件,它接收用户名和密码并将其发送用于身份验证。如果身份验证成功,则页面应移动到呈现另一个组件的不同路由。 现在的问题是,我不知道如何从我的商店改变路线?i、 e.不使用<代码> 我使用React16与MobX的状态管理,和React路由器V4路由。 商店: 登录组件: 主要应用组件:

  • 问题内容: 任何人都可以用C,C ++和Java清楚地解释一下。什么都在堆栈上,什么都在堆上以及何时分配。 我所知道的, 每个函数调用的所有局部变量(无论是基元,指针还是引用变量)都在新的堆栈框架上。 使用new或malloc创建的所有内容都会进入堆。 我对几件事感到困惑。 是在堆上创建的对象成员的引用/基元是否也存储在堆上? 以及在每个框架中递归创建的方法的那些本地成员呢?它们都在堆栈上吗?如果

  • 问题内容: 在此请忍受,因为这个问题与我使用React,Redux或react- redux的第一个测试应用有关。Docs使我步入正轨,并且我有一个可以正常工作的模拟银行应用程序。我的状态对象大致如下所示: 我只有两个动作: 1. CHANGE_HASH(如网址哈希中所示)。此操作始终按预期工作,而reducer所做的只是更新state.activePageId(是的,我正在克隆状态对象而不是对其

  • 我正在使用Spring Boot 2.7.1和<code>Spring BootStarter batch 它工作得很好,但我意识到批处理在运行时在端口8080上侦听,因为我导入了<code>spring boot starter web,通过注入<code>ClientRegistrationRepository,它可以自动配置我的<code>WebClient 问题是,当我通过属性,代码或依赖