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

Next.js App Router中React Query二次加载页面返回旧数据问题

解决方案:React Query缓存旧数据 + Next.js App Router路由返回问题

1. 精准控制React Query缓存失效

你之前的invalidateQueries()未指定具体查询键,导致React Query无法定位要失效的缓存条目。首先确保useQuery使用包含路由参数的唯一查询键:

// 把collection和id加入queryKey,确保每条记录对应唯一缓存
const { data } = useQuery({
  queryKey: ['record', collection, id],
  queryFn: async () => {
    const res = await fetch(`/api/records?collection=${collection}&id=${id}`);
    return res.json();
  },
});

然后在组件卸载时,精准失效该查询键对应的缓存:

useEffect(() => {
  return () => {
    // 仅失效当前记录的缓存,不影响其他查询
    queryClient.invalidateQueries({ queryKey: ['record', collection, id] });
  };
}, [queryClient, collection, id]);

2. 优化本地状态同步逻辑

原useEffect在record已有数据时会跳过更新,但返回路由时record可能保留之前的状态,导致新data无法同步。可以监听路由参数变化,先清空本地状态:

// 当collection或id变化时,重置本地编辑状态
useEffect(() => {
  setRecord({});
}, [collection, id]);

// 仅当data更新时同步到本地状态
useEffect(() => {
  if (!data) return;
  setRecord({ ...data });
}, [data]);

3. 强制刷新页面的备用方案

如果缓存方案仍不生效,可在跳转时强制刷新页面:

用Next.js Router强制刷新

import { useRouter } from 'next/navigation';

const router = useRouter();

// 跳转时开启强制刷新
router.push('/record?collection=1&id=1', { forceRefresh: true });

原生跳转(彻底绕过缓存)

// 直接触发全页面刷新
window.location.href = '/record?collection=1&id=1';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:02:18