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

Next.js页面无法自动刷新获取移动端新增维护合同数据的问题求助

Next.js页面无法自动刷新获取移动端新增维护合同数据的问题求助

我太懂这种郁闷了——移动端刚新增完维护合同,网页端却迟迟刷不出最新数据,试了缓存设置和revalidate都没效果,确实挺闹心的。咱们来一步步排查解决:

先排查现有revalidate配置的问题

你在getMaintenanceContracts的fetch里加了next: { revalidate: 3 },但可能有两个细节没注意到:

  • 你的页面组件是Server Component,默认会被静态渲染,单独在fetch里加revalidate可能不够,需要在页面组件顶部也声明revalidate配置,确保整个页面的缓存策略统一:
    // 在MaintenanceContracts组件顶部添加
    export const revalidate = 3; // 每3秒重新生成页面
    
    const MaintenanceContracts = async () => {
      // 你的原有代码
    };
    
  • 浏览器可能会缓存请求结果,你可以在fetch里明确禁用浏览器缓存,和revalidate配合使用:
    const res = await fetch(`${baseUrl}/contratMaintenaces/`, {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${session?.user.access}`,
      },
      next: { revalidate: 3 },
      cache: "no-store", // 禁用浏览器缓存
    });
    

如果需要实时感知数据变化(而非定时刷新)

如果你的需求是移动端一提交数据,网页端立刻更新,那Server Component的定时revalidate就不够用了,推荐用客户端数据获取方案:

  1. 把页面改成客户端组件(在顶部加'use client')
  2. 使用SWR或者React Query这类库来做数据的实时轮询,或者结合后端的WebSocket推送:
    比如用SWR的示例:
    'use client';
    import { useSWR } from 'swr';
    import { MaintenanceContractDataTable } from "@/components/maintenanceContractDataTable/data-table";
    import { maintenanceContractColumns } from "@/components/maintenanceContractDataTable/maintenanceContractColumns";
    import { buttonVariants } from "@/components/ui/button";
    import { getMaintenanceContracts } from "@/services/maintenanceContract";
    import { MaintenanceContractT } from "@/types/maintenanceContract";
    import Link from "next/link";
    
    const MaintenanceContracts = () => {
      // 每2秒轮询一次获取最新数据
      const { data: maintenanceContracts, error } = useSWR('maintenance-contracts', getMaintenanceContracts, {
        refreshInterval: 2000,
      });
    
      if (error) return <div>加载出错了</div>;
      if (!maintenanceContracts) return <div>加载中...</div>;
    
      return (
        <section className="container w-[100%] bg-[#ffffff] p-3 space-y-3 rounded">
          <header className="flex justify-between items-center mb-10">
            <h6 className="text-3xl">Contrats de maintenances</h6>
            <Link href="maintenanceContract/addMContract" className={`${buttonVariants({ variant: "default", })} bg-[#2264E5] text-white hover:bg-blue-400 hover:text-white`} >
              Créer un contrat de maintenance
            </Link>
          </header>
          <MaintenanceContractDataTable columns={maintenanceContractColumns} data={maintenanceContracts} />
        </section>
      );
    };
    
    export default MaintenanceContracts;
    
    这样客户端会定时请求最新数据,移动端新增的内容很快就能同步到网页端。

额外排查点

  • 确认后端接口/contratMaintenaces/返回的是最新数据,可以直接用Postman测试接口,排除后端缓存的问题
  • 检查getServerSession是否会缓存会话信息,导致请求用了旧的token(不过这个概率较低)

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:08:05