React-Query:如何在onSuccess回调中从useQuery获取数据?

Shi*_*iqi 20 reactjs react-query

我正在学习react-query,遇到一些问题。我想使用data我通过获取数据得到的useQuery,但我得到data的是undefined。这是我的代码:

import React from "react";
import { useQuery } from "react-query";
import { fetchData } from "./providesData";
const Home = () => {
  const {data} = useQuery("fetchData", fetchData, {
    onSuccess: () => {
      console.log("Get data!");
      console.log(data); // undefined
    }
  });

  return <div></div>;
};

export default Home;
Run Code Online (Sandbox Code Playgroud)

但我看到react-query devtools提取成功并且data在这里。所以我认为我没有正确访问回调data中的onSuccess。那么我们如何才能访问到data回调中的呢?我试过:

const query = useQuery("fetchData", fetchData, {
    onSuccess: () => {
      console.log("Get data!");
      console.log(query.data); // undefined
    }
  });
Run Code Online (Sandbox Code Playgroud)

但仍然没有运气。

我阅读了文档并发现了这一点:

onSuccess: (数据: TData) => void

所以我在我的代码中尝试了这个:

const {data} = useQuery("fetchData", fetchData, {
    onSuccess: (data: TData) => {
      console.log("Get data!");
      console.log(data); // success
    }
  });
Run Code Online (Sandbox Code Playgroud)

这次成功了。但我不明白为什么......并且代码编辑器也警告我:

Type annotations can only be used in TypeScript files.ts(8010)
Run Code Online (Sandbox Code Playgroud)

谁能告诉我正确的方法吗?太感谢了!

这是一个演示

Ste*_*oit 18

我刚刚这样做了:

useQuery("fetchData", fetchData, {
    onSuccess: (data) => {
      console.log("Get data!");
      console.log(data);
    }
  });
Run Code Online (Sandbox Code Playgroud)


Sow*_*man 17

仅当从查询中检索到onSuccess时才会调用回调函数。data请仔细注意,这data不是您从返回对象中解构的对象useQuery,而是在从 API 成功检索数据时传递给回调的对象。因为它是一个回调函数,所以您不需要检查等待/加载情况,因为如果您的请求成功,它最终会被调用。

在您的情况下,第一个变量将在组件安装后立即data返回,因为该调用是异步调用,这意味着从调用返回的数据需要从. 因此,它不会在组件安装后立即可用,而是只有在查询成功解析后才可用。此外,react-query钩子会使用在设置实际对象(钩子返回的对象)并从钩子返回之前接收到的数据来调用回调。undefinedHomeuseQueryuseQueryPromiseHome useQueryonSuccess(data)datauseQuery

由于useQuery是异步调用(内部),因此它还提供了诸如、等request in-flight标志,您可以使用它们对数据、错误或任何其他合适的目的进行空检查。isLoadingisFetching

  • 感谢您的回复。我以为 `onSuccess` 会在 `Promise` 解决之后被调用。因此,如果我想在“Promise”解决后做某事,我应该执行“if(isSuccess) console.log(data)”。 (4认同)