react-query: useQuery returns 未定义且组件不重新呈现

react-query: useQuery returns undefined and component does not rerender

我正在玩一个小演示应用 reactQuery,您可以在 this repo. The app calls this 模拟 API.

中看到

我遇到了一个问题,我正在使用 useQuery 挂钩在产品中调用此函数 API file:

export const getAllProducts = async (): Promise<Product[]> => {
  const productEndPoint = 'http://localhost:5000/api/product';
  const { data } = await axios.get(productEndPoint);
  return data as Array<Product>;
};

在我的 ProductTable 组件中,我使用以下方式调用此函数:

const { data } = useQuery('products', getAllProducts);

我发现确实调用了 API,并且返回了数据。但网格中的 table 始终为空。

如果我进行调试,我会看到 useQuery 返回的数据对象未定义。

Web 请求成功完成,我可以在浏览器请求下的网络选项卡中看到返回的数据。

我怀疑它可能是 getAllProducts 的结构方式或异步等待问题,但无法完全弄清楚。

谁能指出 IO 哪里出了问题?

我已经设法让它工作了。为了他人的利益,我分享我的经验教训:

我从 api 函数开始做了一些小改动。将函数更改为以下内容:

export const getAllProducts = async (): Promise<Product[]> => {
   const response = await axios.get(`api/product`, {
     headers: {
       Accept: 'application/json',
       'Content-Type': 'application/json',
     },
 });

  return response.data as Product[];
};

我没有解构 axios 调用的响应,而是从中获取数据对象,return 作为 Product[]

然后我更改的第二件事是在我的 ProductTable 组件中。在这里,我通过将调用更改为 :

来告诉 useQuery 预期的响应类型
const { data } = useQuery<Product[], Error>('products', getAllProducts);

最后,我犯了一个新手错误:因为我在本地主机上的 docker 容器 运行 中使用了模拟 api 并使用 http://localhost 调用它: 5000/api/product 我遇到了众所周知的网络错误:

localhost has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present...

为了解决这个问题,我只是在 packages.json 文件中添加了一个 属性:"proxy":"http://localhost:5000",

这现在已经成功地允许获取数据,正如我所期望的那样。

就这么用 起初数据是未定义的,所以映射未定义的数据会给你一个错误,所以我们必须使用 isLoading,如果 isLoading 是真的,我们不会渲染或映射数据,直到 isLoading 变为假,然后我们可以渲染或 return 数据。

export const getAllProducts = async (): Promise<Product[]> => {
  const productEndPoint = 'http://localhost:5000/api/product';
  const res= await axios.get(productEndPoint);
  return res.data as Array<Product>;
};

const { data:products , isLoading } = useQuery('products', getAllProducts);

if(isLoading){
return <FallBackView />
}

return (){
products.map(item => item)
}