无法使用 useQuery 挂钩为具有一些 @client 变量的远程查询获取数据

Posted

技术标签:

【中文标题】无法使用 useQuery 挂钩为具有一些 @client 变量的远程查询获取数据【英文标题】:Unable to fetch data with useQuery hook for a remote query that has some @client variables 【发布时间】:2020-05-26 12:44:50 【问题描述】:

下面给出的是获取产品列表并将其存储在 apollo-client 本地缓存中的查询。它检索每个产品的products 列表和images 列表

const GET_PRODUCTS_QUERY = gql`
  query Products($cursor: String, $query: String, $imageCount: Int = 100) 
    products(first: 9, after: $cursor, query: $query) 
      edges 
        cursor
        node 
          id
          selected @client
          title
          description
          images(first: $imageCount) 
            edges 
              node 
                id
                originalSrc
                selected @client
              
            
          
        
      
    
  
`;

我有一堆productsselected: true,每个产品都会有一个或多个imagesselected: true

GET_PRODUCTS_QUERY 正被一个获取产品并呈现产品的ProductsList 组件使用。这工作正常。当用户选择某个产品时,selected 在本地缓存中被标记为真,ProductsList 组件重新渲染。到目前为止,一切都很好。

我有另一个组件,我需要使用相同的GET_PRODUCTS_QUERY 来获取产品,但只能从缓存中。该组件应该监听缓存中的产品列表,并且每当缓存中的某些内容发生变化时,它应该重新呈现。我尝试以下无济于事

export default () => 
  const  data: productsData =   = useQuery(GET_PRODUCTS_QUERY,  fetchPolicy: "cache-only" );
  const  selectedProducts = []  = productsData;
  //Render selected products

在初始渲染期间,查询被执行并且没有按预期返回任何内容。

在 ProductsList 获取产品列表并填充缓存后,我希望在侦听查询时调用渲染函数,但它没有发生 我通过更改其他一些道具来手动影响渲染,以便触发 useQuery。但我仍然没有从缓存中获得任何产品,尽管它在那里。

谁能解释一下我哪里出错了?

【问题讨论】:

【参考方案1】:

您正在获取两个不同的查询 - 您需要确保不仅查询相同,而且传递给两个挂钩的变量也相同。

这样想。例如,当您获取 20 个产品时

products(first: 20)

Apollo 将结果存储在缓存中时对其进行规范化。每个产品都单独存储并分配一个密钥。然后products 字段与这些键相关联。但是,想象一下,如果您随后查询 21 种产品:

products(first: 21)

如果 Apollo 忽略传递给该字段的参数值,它会将其视为缓存命中,并仅返回与先前查询关联的 20 个产品。幸运的是,它不会那样做。每个键列表不仅与字段相关联,还与提供给该字段的参数相关联。如果参数发生变化,并且参数组合尚未在缓存中,则 Apollo 知道它需要从服务器获取数据。

【讨论】:

实际上我没有为变量传递任何值。所以这意味着first 在这两种情况下都是 9。 cursorquery 也没有通过。想知道是否与此问题有关github.com/apollographql/react-apollo/issues/3816 您确定cursorquery 未定义吗?例如,query 最初是一个空字符串吗? 我很确定情况就是这样。我现在没有代码,因为我采用了另一种方法来为选定的产品和图像维护单独的数据结构。这对我有用。我稍后会再试一次。无论如何,上述方法是我尝试实现嵌套选择功能的正确方法吗? 像这样的嵌套字段非常适合派生字段,但在处理实际状态时有点痛苦。有几次我遇到过类似的情况,我通常将本地状态作为根,这听起来就像你最终做的那样。没有那么优雅,但更容易维护。

以上是关于无法使用 useQuery 挂钩为具有一些 @client 变量的远程查询获取数据的主要内容,如果未能解决你的问题,请参考以下文章

调用useEffect挂钩时useQuery数据未定义?

返回上一个屏幕时执行 useQuery() 挂钩反应原生堆栈导航器

当来自 Apollo useQuery 挂钩的“数据”返回 useMemo 所依赖的“数据”的新值时,useMemo 未运行

react native apollo client useQuery invalid hook call error

使用 TypeScript 反应 Apollo useQuery 钩子

我正在尝试在 Typescript 中使用 useQuery