具有动态参数的提供程序内的 react-query useQuery

react-query useQuery inside a provider with with dynamic parameters

我正在使用 React 查询,因为它非常强大,但我正在努力尝试在提供商内部的许多组件之间共享我的数据。我想知道这是否是正确的方法。

PostsContext.js

import React, {useState} from 'react';
import { useTemplate } from '../hooks';

export const PostsContext = React.createContext({});

export const PostsProvider = ({ children }) => {
    const fetchTemplate = useTemplate(templateId);
   
    const context = {
        fetchTemplate,
    };

    return <PostsContext.Provider value={context}>{children}</PostsContext.Provider>;
};

useTemplate.js

import React from 'react';
import { useQuery } from 'react-query'
import { getTemplateApi } from "../api";

export default function useTemplate(templateId) {
    return useQuery(["templateId", templateId], () => getTemplateApi(templateId), {
        initialData: [],
        enabled:false,
    });
}

然后是我使用上下文的组件

function Posts () {
    const { fetchTemplate } = useContext(PostsContext);

    console.log(fetchTemplate.isLoading)

    fetchTemplate.refetch() <---- how can I refetch with a different templateId?

    return {...}

}

我正在寻找一种方法来使用不同的 templateId 动态调用我的挂钩,但该挂钩位于提供程序内,因此我可以在我的整个应用程序中使用它。这是正确的方法吗?我有很深的嵌套组件,我不想支撑钻头。

你不需要额外的方式来分发你的数据,比如反应上下文。只需在任何需要的地方使用相同的键调用 useQuery,react query 就会完成剩下的工作。最好在自定义挂钩中将其抽象化。

refetch 只应在您想使用完全相同的参数重新获取时使用。对于更改参数,最好这样做。使它们成为您的查询键的一部分,因为只要查询键更改,反应查询就会重新获取。

因此在您的示例中,您只需要使用不同的 templateId 调用 useTemplatetemplateId 本身是本地状态(用户选择了哪个模板),如何使其全局可用取决于您。