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

Next.js 13/14服务器组件返回页面时不自动重新获取数据问题

解决方案

方法1:页面级禁用缓存(简单直接)

在DjProfile服务器组件顶部添加缓存配置,强制页面每次导航进来都重新获取数据:

export const revalidate = 0; // 禁用缓存,每次请求都重新生成页面

export default async function DjProfile({ params }) {
  const tracks = await getUserLikes(params?.id);

  return (
    <Suspense fallback={<LoadingGrid />}>
      <TrackContainer tracks={tracks} />
    </Suspense>
  );
}

方法2:精准控制数据获取缓存(更灵活)

用Next.js的unstable_cache包裹数据获取函数,指定缓存规则,确保不同用户的点赞数据按需刷新:

import { unstable_cache } from 'next/cache';

const getUserLikes = unstable_cache(
  async (userId) => {
    const likesRef = collection(db, "likes");
    const querys = query(likesRef, where("currentUser", "==", userId));
    const querySnapshot = await getDocs(querys);

    const likesData = [];
    querySnapshot.forEach((doc) => {
      const data = doc.data();
      likesData.push(data);
    });

    console.log("new likes", likesData);
    return likesData;
  },
  ['user-likes'], // 缓存标识标签
  { revalidate: 0 } // 完全禁用缓存,每次调用都重新请求
);

方法3:组件级设置无缓存

在组件内直接设置当前请求的缓存策略为no-store,避免复用缓存数据:

import { cache } from 'next/cache';

export default async function DjProfile({ params }) {
  cache('no-store'); // 当前请求不缓存数据
  
  const tracks = await getUserLikes(params?.id);

  return (
    <Suspense fallback={<LoadingGrid />}>
      <TrackContainer tracks={tracks} />
    </Suspense>
  );
}

问题根源

Next.js的Link组件用客户端路由,默认会复用服务器组件的缓存数据;而a标签触发完整页面刷新,会重新拉取所有数据。上面的方法都是通过调整缓存策略,让客户端路由导航时也能获取最新数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:31:03