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

刷新时router.query参数为undefined导致react-query查询失效怎么办?

解决Next.js刷新页面时React Query查询丢失的问题

问题根源

在Next.js中,useRouter返回的router.query在页面初始加载(尤其是刷新场景)时可能处于未初始化状态,此时id值为undefined。直接将其传入useQuery会引发两个问题:

  • 发起无效API请求(URL中会包含undefined)
  • React Query的查询键变为["pzs", undefined],当id正确加载后,查询键更新为["pzs", 实际ID],旧的无效查询会被DevTools标记为过时并移除,造成「查询丢失」的错觉

解决方案

1. 给useQuery添加启用条件

修改自定义React Query钩子,仅当id存在时才触发查询:

const fetchPZDetailData = (id) => {
  return axiosInstance.get(`documents/pzs/${id}`);
};

export const usePZDetailData = (id) => {
  return useQuery(
    ["pzs", id], 
    () => fetchPZDetailData(id), 
    { 
      enabled: !!id // 只有id非空时才执行查询
    }
  );
};

2. 组件保持原有逻辑即可

你的PZDetail组件无需额外修改,当router.query.id加载完成后,enabled自动切换为true,React Query会自动发起正确的查询:

import { usePZDetailData } from "../../hooks/usePZData";
import { useRouter } from "next/router";
const PZDetail = () => {
  const router = useRouter();
  const { id } = router.query;
  const { data, isLoading, error } = usePZDetailData(id);

  return (
    <>
      {isLoading && <div>加载中...</div>}
      {error && <div>加载失败:{error.message}</div>}
      {data && <div>详情内容:{JSON.stringify(data)}</div>}
    </>
  );
};

export default PZDetail;

补充说明

  • 这种方式利用React Query的内置机制自动触发查询,比在useEffect中手动调用refetch更符合React Query的设计理念
  • 请确保你的axiosInstance配置正确,排除CORS、基础路径错误等网络问题导致的请求失败(这也是查询丢失的潜在诱因)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:40:26