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

Next.js 14中如何在TRPC+React Query中跨组件触发通知计数重取?

解决TRPC标记通知已读后更新计数组件的问题

要实现标记通知已读后自动更新BadgedUserAvatar组件中的通知计数,核心是利用TRPC(基于React Query)的缓存失效机制,让计数查询自动重新获取最新数据。以下是两种简洁的实现方式:

方法一:在Mutation的onSuccess中手动失效计数查询

直接在标记已读的mutation成功回调里,调用TRPC提供的invalidate方法触发计数查询的重取:

export default function Inbox(): JSX.Element {
  // ... 其他代码
  const { data, isLoading, refetch } = trpc.inbox.search.useQuery({
    query: { offset: 0, limit: 5, status: InboxMessageStatus.UNREAD },
  });

  const { mutate: readNotification } = trpc.inbox.read.useMutation({
    onSuccess: async () => {
      // 先重取通知列表
      await refetch();
      // 失效计数查询,触发BadgedUserAvatar组件重新获取最新计数
      await trpc.inbox.count.invalidate();
    },
  });
  // ... 其他代码
}

方法二:用TRPC的invalidates配置自动失效查询

更简洁的方式是在mutation配置中直接指定要失效的查询,无需手动在onSuccess里调用:

export default function Inbox(): JSX.Element {
  // ... 其他代码
  const { data, isLoading, refetch } = trpc.inbox.search.useQuery({
    query: { offset: 0, limit: 5, status: InboxMessageStatus.UNREAD },
  });

  const { mutate: readNotification } = trpc.inbox.read.useMutation({
    onSuccess: () => refetch(),
    // 自动失效计数查询
    invalidates: [{ type: 'query', procedure: trpc.inbox.count }],
  });
  // ... 其他代码
}

原理说明

TRPC基于React Query实现数据缓存,当你调用invalidate或者配置invalidates时,对应的查询缓存会被标记为"失效"。BadgedUserAvatar组件中的trpc.inbox.count.useQuery()会自动检测到缓存失效,重新发起请求获取最新的通知计数,无需手动传递状态或触发重取。

内容的提问来源于stack exchange,提问作者Ignacio García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:05:18