Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何强制Apollo客户端使用缓存数据查看详细信息页面_Reactjs_Apollo_React Apollo_Apollo Client - Fatal编程技术网

Reactjs 如何强制Apollo客户端使用缓存数据查看详细信息页面

Reactjs 如何强制Apollo客户端使用缓存数据查看详细信息页面,reactjs,apollo,react-apollo,apollo-client,Reactjs,Apollo,React Apollo,Apollo Client,我有一个分页的基于光标的查询TODOS和带有查询TODO的详细信息页面,以按ID获取数据。 每当我转到详细信息视图并将useQuery与TODO查询一起使用时(该查询包含与TODOS查询结果完全相同的数据),它仍然尝试从服务器而不是从缓存中获取数据。如何实现不从服务器获取数据(因为它已经存在),我以为阿波罗通过身份证探测并从缓存中返回,但没有。有什么建议吗 类似的问题没有这个,但我认为这不是一个正确的方法,应该有更好的解决方案 这是待办事项查询: query TODOS( $paginati

我有一个分页的基于光标的查询TODOS和带有查询TODO的详细信息页面,以按ID获取数据。 每当我转到详细信息视图并将useQueryTODO查询一起使用时(该查询包含与TODOS查询结果完全相同的数据),它仍然尝试从服务器而不是从缓存中获取数据。如何实现不从服务器获取数据(因为它已经存在),我以为阿波罗通过身份证探测并从缓存中返回,但没有。有什么建议吗

类似的问题没有这个,但我认为这不是一个正确的方法,应该有更好的解决方案

这是待办事项查询:

query TODOS(
  $paginationOptions: PaginationOptionsInput
) {
  todos(paginationOptions: $paginationOptions) {
    pagination {
      minCursor
      maxCursor
      sortOrder
      limit
      hasMoreResults
    }
    result {
     id
     ...SomeTodoFields
  }
}
在详细信息页面上,我有第二个查询TODO

query (
  $todoId: String!
) {
  todo(todoId: $todoId) {
    id
    ...SomeTodoFields
  } 
}

由于我使用的是Apollo client<3.0 for me,所以运行良好,您可以进一步查看。仔细阅读每一条注释,这非常重要!我的代码示例:

cache: new InMemoryCache({
    fragmentMatcher,
    cacheRedirects: {
      Query: {
        todo: (_, args, { getCacheKey }) => {
          return getCacheKey({ __typename: 'TodoType', id: args.todoId })
        }
      }
    }

  })
})
找到了一些相关的好东西,你可能想检查一下。
这对我很有用,希望对其他人也有帮助。:)

你能发布一些代码,以便我们给你一些指导吗?Apollo客户端在进行任何查询之前都要查看缓存,除非您明确告诉它不要使用缓存,否则您可能正在做一些意外的事情,这会导致缓存被忽略。将在一分钟内更新。如果分页TODO查询和单个TODO查询下的字段相同,它不应该从缓存返回,或者需要一些额外的配置来实现这一点?那么您需要做的主要事情是:需要检查的是从TODO查询结果返回的uu类型名,以及TODO查询的结果部分。其思想是,如果_类型名与这些对象匹配,则Apollo客户端能够确定它们是否相同,从而执行正确的缓存查询。我的建议是将uu typename字段添加到每个查询中,并将结果作为第一步进行比较。u typename有点不同,因为TODOS查询是分页的,所以它将paginatedTodosType作为根u typename返回,并且它具有u typename:todoType的结果字段数组。当我获取TODO查询时,我获取的是一个类型为uu typeName:todoType的对象