反应查询 useQuery,GraphQL + fetch。如何传递变量?

Posted

技术标签:

【中文标题】反应查询 useQuery,GraphQL + fetch。如何传递变量?【英文标题】:React-query useQuery, GraphQL + fetch. How to pass variables? 【发布时间】:2021-08-29 16:45:07 【问题描述】:

我正在尝试从我的 Strapi GraphQl api 获取数据并将它们分页。为此,我需要传递变量。我正在使用 react-queryfetch api

在这里我声明我的变量和查询。

const endpoint = "http://localhost:1337/graphql"
let limit: number = 10;
let start: number = 0;
export const QUERY = `
query fetchProducts ($limit: Int!, $start: Int!)  
  products(limit: $limit, start: $start) 
    title
    price
    slug
    image 
      formats
    
  

`;

这是我的抓取功能

  async function fetchData(endpoint: string, query: string, limit: number, start: number) 
    const res = await fetch(endpoint, 
        method: "POST",
        headers: 
            "Content-Type": "application/json",
        ,
        body: JSON.stringify( query: query ),
    );
    const json = await res.json();
    const 
        data:  products ,
     = json;
    start += 10; //when refetching, it fetches another 10
    return products;

这是来自 react-query 的 useQuery 钩子

const  data, status, refetch  = useQuery(["blog", limit, start], () => fetchData(endpoint, QUERY, limit, start), 
    keepPreviousData: true,
);

我收到错误:

“未提供所需类型“Int!”的变量“$limit”

“未提供所需类型“Int!”的变量“$start”。

所以我没有正确传递变量。我做错了什么?

【问题讨论】:

【参考方案1】:

从 react-query 特定的角度来看,它看起来不错:

将所有变量作为查询键的一部分 将它们正确传递给 queryFn

我不是 graphQL 专家,但在查看 this example blog post 如何将 graphql 与 fetch 一起使用时,您需要将 variables 传递到 query 旁边,作为您的 body 请求的 body .

类似:

body: JSON.stringify(
  query: query,
  variables:  limit, start 
),

我认为如果您使用轻量级抽象,这会变得更容易一些,例如 graphql-request,这也是 react-query example 使用的。

【讨论】:

谢谢,向正文添加变量解决了这个问题! :)

以上是关于反应查询 useQuery,GraphQL + fetch。如何传递变量?的主要内容,如果未能解决你的问题,请参考以下文章

用反应钩子重试失败的graphql查询?

@apollo/client 反应钩子 useQuery() 数据未定义

在 useQuery 后反应组件不重新渲染

如何在第一次渲染和点击时都渲染 useQuery? [ReactJS,graphql]

如何在反应路由器中调用阿波罗客户端 useQuery?

如何在 apollo graphql reactjs 中使用 detalization 查询?