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就不够用了,推荐用客户端数据获取方案:
- 把页面改成客户端组件(在顶部加
'use client') - 使用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
相关产品推荐
相关产品推荐

