You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Query的refetch()中传递日期变量?

解决方案

1. 先修复原useQuery的关键问题

原代码中查询函数没有返回Promise,会导致useQuery无法正常获取数据,这是必须先修正的bug:

const { isLoading: isBskLoading, refetch: refetchBskData } = useQuery(
    "bskFixturesData",
    // 补充return,确保返回请求Promise
    () => instance.get(`/basketball/matches/${date}`).then((res) => res.data),
    {
        onSuccess: (jsonData) => {
            setBskData(jsonData);
            setHasBskData(true);
        },
        refetchOnWindowFocus: false,
        enabled: false,
    }
);

2. 推荐方案:通过查询键传递日期(兼顾缓存正确性)

将日期加入查询键,让react-query为不同日期维护独立缓存,同时让查询函数能读取refetch时传入的新日期:

修改useQuery代码

const { isLoading: isBskLoading, refetch: refetchBskData } = useQuery(
    // 查询键改为数组,包含查询名称和日期,确保不同日期的缓存不冲突
    ["bskFixturesData", date],
    // 从queryKey中提取目标日期
    async ({ queryKey }) => {
        const [_, targetDate] = queryKey;
        const res = await instance.get(`/basketball/matches/${targetDate}`);
        return res.data;
    },
    {
        onSuccess: (jsonData) => {
            setBskData(jsonData);
            setHasBskData(true);
        },
        refetchOnWindowFocus: false,
        enabled: false,
    }
);

调用refetch时传入新日期

useEffect(() => {
    const date = new Date(location.state.date);
    const formattedDate = date.toLocaleDateString("en-GB");
    // 传递新的查询键参数,覆盖原日期
    refetchBskData({ queryKey: ["bskFixturesData", formattedDate] });
}, [refetchBskData, location]);

3. 可选方案:直接传递变量给查询函数

如果不需要区分不同日期的缓存,也可以直接在refetch时传递变量:

修改useQuery代码

const { isLoading: isBskLoading, refetch: refetchBskData } = useQuery(
    "bskFixturesData",
    // 接收refetch传递的变量
    async (variables) => {
        // 优先使用refetch传入的日期,无则用默认值
        const targetDate = variables?.date || date;
        const res = await instance.get(`/basketball/matches/${targetDate}`);
        return res.data;
    },
    {
        onSuccess: (jsonData) => {
            setBskData(jsonData);
            setHasBskData(true);
        },
        refetchOnWindowFocus: false,
        enabled: false,
    }
);

调用refetch时传递变量

useEffect(() => {
    const date = new Date(location.state.date);
    const formattedDate = date.toLocaleDateString("en-GB");
    // 传递日期变量给refetch
    refetchBskData({ date: formattedDate });
}, [refetchBskData, location]);

内容的提问来源于stack exchange,提问作者Rayyan Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:10:40