【问题标题】:How to refetch queries from sibling component with react-query如何使用 react-query 从同级组件重新获取查询
【发布时间】:2021-09-16 04:34:26
【问题描述】:

我想知道如何使用 react-query 从另一个同级组件重新获取查询。

假设我有组件 A

 import {useQuery} from "react-query";

 function ComponentA(){

    const getData = async () => data //returns api data

    const {data, refetch} = useQuery(["queryA"], async () => await getData())

    return(

         <div>
           {data}
         </div>

   )}

在组件 B 中

 import {useQuery, QueryClient} from "react-query";

 function ComponentB(){

    const queryClient = new QueryClient({
    defaultOptions: {
        queries: {
            staleTime: Infinity,
        },
    },
})

const refreshQueryFromComponentA = async () => {
     await queryClient.refetchQueries(["queryA"], { active: true })
}

    return(

         <div>
           <button onClick={refreshQueryFromComponentA}/>
         </div>

   )}

在 Page.js 中

 import ComponentA from "./componentA";
 import ComponentB from "./componentB";

 function Page(){

    return(

         <div>
           <ComponentA/>
           <ComponentB/>
         </div>

   )}

当我在 ComponentB 中调用 refreshQueryFromComponentA 函数时,我看不到 ComponentA 中的查询刷新或网络选项卡中对后端的新调用。我也使用了正确的查询键,但我只能使用来自 useQuery 函数的 refetch() 函数重新获取 ComponentA 中的查询。

我认为我正在尝试做的事情是可能的,因为 react-query 使用上下文并且应该在整个应用程序中都可用。但也许我使用了错误的方法或误解了它。

提前谢谢大家!

【问题讨论】:

    标签: javascript reactjs caching next.js react-query


    【解决方案1】:

    您的应用顶部需要有一个 QueryClient。 QueryClient 拥有存储数据的 queryCache。如果你在 componentB 中创建一个新的,它不会与 componentA 共享任何东西。此外,请确保将其添加到 QueryClientProvider 并通过 useQueryClient() 检索它。客户端也需要稳定,所以不要每次渲染都创建一个新的。这是来自文档的第一页:

    import { QueryClient, QueryClientProvider, useQuery } from 'react-query'
    2 
    3 const queryClient = new QueryClient()
    4 
    5 export default function App() {
    6   return (
    7     <QueryClientProvider client={queryClient}>
    8       <Example />
    9     </QueryClientProvider>
    10   )
    11 }
    

    【讨论】:

    • 抱歉,我的顶级 app.js 中有一个 queryClient。我只是用这个作为一个简单的例子。但是我确实看到了我在哪里犯了错误,通过在 ComponentB 内创建一个新的 queryClient,它确实不会与 componentA 共享任何数据。我需要找到正确的方法来从我的 ComponentB 内的顶级 QueryClientProvider 访问 queryClient 方法。谢谢!
    • 是的,正确的方法是useQueryClient()
    • 谢谢,我都不知道我怎么错过了??
    猜你喜欢
    • 2023-01-30
    • 2021-06-01
    • 2021-12-08
    • 1970-01-01
    • 2020-03-30
    • 2019-05-10
    • 2019-12-20
    • 2021-07-18
    • 2021-06-19
    相关资源
    最近更新 更多