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

React聊天应用中,使用useInfiniteQuery如何添加新数据且不重新请求

解决React Query useInfiniteQuery缓存更新后UI不刷新的问题

你的问题出在没有遵循不可变数据更新原则。React Query对缓存的变化检测依赖浅比较,你直接修改了pages[0]内部的属性,虽然外层newData是新对象,但pages数组里的第一个元素还是原引用,导致React Query认为数据没变化,所以UI不更新。

正确的更新方式

需要完全创建新的嵌套对象,确保每一层引用都更新:

const { mutate: mutateSendMessage } = useMutation({
  mutationFn: postMessage,
  onSuccess: (newMessage) => {
    queryClient.setQueryData(['messages', chatId], (existingMessages) => {
      if (!existingMessages) return existingMessages;

      // 复制pages数组,避免修改原数组引用
      const newPages = [...existingMessages.pages];
      // 复制第一个page对象,更新内部属性
      const updatedFirstPage = {
        ...newPages[0],
        results: [newMessage, ...newPages[0].results], // 用展开式创建新数组,替代unshift
        count: newPages[0].count + 1
      };
      // 替换pages数组的第一个元素
      newPages[0] = updatedFirstPage;

      // 返回完整的新数据结构
      return {
        ...existingMessages,
        pages: newPages
      };
    });
  }
});

关键改动说明

  • 用[...existingMessages.pages]复制pages数组,创建新的数组引用
  • 对第一个page对象做浅拷贝,同时用展开式[newMessage, ...results]创建新的results数组,替代会修改原数组的unshift
  • 最后将更新后的page替换进新的pages数组,再返回新的顶层数据对象

这样每一层都是新的引用,React Query能检测到缓存变化,UI就会自动更新了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:24