【问题标题】:react-query: how to get the data from useQuery in onSuccess callback?react-query:如何在 onSuccess 回调中从 useQuery 获取数据?
【发布时间】:2021-06-27 23:37:43
【问题描述】:

我正在学习react-query,但遇到了一些问题。我想使用通过useQuery 获取数据的data,但我得到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;

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

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

但还是没有运气。

我阅读了documentation 并发现了这个:

onSuccess: (data: TData) => void

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

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

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

Type annotations can only be used in TypeScript files.ts(8010)

谁能告诉我正确的方法?非常感谢!

这是demo

【问题讨论】:

  • 关于您的错误::TData 是 Typescript 语法。如果您使用 JavaScript,请忽略它
  • @TkDodo 是的,我只使用 JavaScript。但奇怪的是它有效。
  • 如果您通过发布请求获取数据,这可能意味着您想使用useMutation 而不是useQueryuseMutation 将数据作为配置回调onSuccess 的参数,而useQuery 仅在您发出 get 请求时才有数据。

标签: reactjs react-query


【解决方案1】:

只有在从查询中检索到 data 时,才会调用 onSuccess 回调函数。请注意,这个data 不是您从useQuery 返回对象中销毁的那个,而是在成功从您的API 中检索数据时传递给回调的那个。由于它是一个回调函数,因此您无需检查等待/加载情况,因为如果您的请求成功,它最终会被调用。

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

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

【讨论】:

  • 感谢您的回复。我以为onSuccess 会在Promise 解决后被调用。所以如果我想在Promise解决后做点什么,我应该做if(isSuccess) console.log(data)
  • 嗨,我可以返回 jsx 元素 onSuccess 吗?
【解决方案2】:

我刚刚这样做了:

useQuery("fetchData", fetchData, {
    onSuccess: (data) => {
      console.log("Get data!");
      console.log(data);
    }
  });

【讨论】:

  • 尽可能简单。谢谢!
猜你喜欢
  • 2021-12-08
  • 2022-11-12
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2021-10-14
  • 2021-09-29
相关资源
最近更新 更多