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

T3 Stack(Next.js 14)中TRPC getAll查询不更新问题求助

解决T3 Stack + Next.js 14 App目录下添加用户后列表不更新的问题

问题根源

你在users page.tsx里用await api.users.getAll.query()获取数据,这是服务器组件中的tRPC查询,Next.js 14默认会对这类查询做静态缓存。即使你在客户端调用invalidate,服务器端的静态缓存不会自动刷新,所以跳转后还是加载旧数据。

具体解决方案

方案1:禁用用户列表查询的静态缓存

在users/page.tsx中,给查询添加cache: "no-store"参数,强制每次请求都从服务器获取最新数据:

const usersList = await api.users.getAll.query(undefined, { cache: "no-store" });

或者在页面文件顶部添加动态配置,让整个页面变成动态渲染:

export const dynamic = "force-dynamic";

方案2:确保客户端失效操作正确执行

如果你的添加用户表单是客户端组件,要确保在onSuccess中异步等待失效操作完成后再跳转:

const addUserMutation = api.users.add.useMutation({
  onSuccess: async () => {
    // 等待失效操作完成
    await api.users.getAll.invalidate();
    router.push("/users");
  },
});

之前你用void ctx.users.getAll.invalidate()没有效果,大概率是因为没有等待异步操作完成就跳转,而且ctx可能不是客户端的api实例,直接用api客户端调用invalidate才是正确方式。

方案3:使用revalidateTag(可选)

如果你的tRPC路由配置了缓存标签,可以在mutation成功后重新验证对应标签:
在路由定义中给getAll查询添加标签:

export const router = createTRPCRouter({
  getAll: publicProcedure
    .meta({ tags: ["users"] })
    .query(() => {
      // 查询逻辑
    }),
  add: publicProcedure
    .input(z.object({/* 输入定义 */}))
    .mutation(async ({ input }) => {
      // 添加用户逻辑
    }),
});

然后在客户端的onSuccess中调用:

await api.utils.revalidateTags(["users"]);
router.push("/users");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:28:10