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

如何使用RTK Query的upsertQueryData向缓存新增条目而非覆盖?

解决方案

问题出在upsertQueryData的使用逻辑上:你直接将单个站点对象作为第三个参数传入,这会直接覆盖getSites查询缓存的全部数据。正确做法是通过第三个参数的回调函数,基于现有缓存数据进行修改。

修改onQueryStarted中的代码:

async onQueryStarted({}, { dispatch, queryFulfilled }) {
  const { data } = await queryFulfilled;
  const newSiteEntry = data.createSite.site;
  // getSites查询无参数,第二个参数传空对象以匹配原有缓存
  dispatch(
    sites.util.upsertQueryData('getSites', {}, (draft) => {
      // 通过Immer直接修改draft数组,添加新站点
      draft.push(newSiteEntry);
    })
  );
}

需要注意两个关键细节:

  • getSites查询没有接收参数,因此upsertQueryData的第二个参数必须传空对象,这样才能匹配到原有的sites集合缓存。你之前传入的{ newSiteEntry.id }是错误的,这会创建一个新的缓存条目而非更新原有集合。
  • 当upsertQueryData的第三个参数为函数时,RTK Query会通过Immer允许你直接修改draft状态,就像在Redux Toolkit的slice中操作状态一样,直接push新站点即可完成新增。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:42