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

使用RTK Query实现收藏功能时findIndex总返回-1该如何解决?

问题根因

findIndex始终返回-1的核心原因是比对两侧的值类型/结构不匹配,从你提供的代码看有两种典型的触发场景:


场景1:添加收藏时存入的是纯ID值(最常见)

你在makeFav reducer中是直接把action.payload存入cardFavId数组,如果调用makeFav时传的就是纯ID(数字/字符串),那么数组中的每一项都是基础类型的值,没有.id属性。
此时你在removeFav中取cardItem.id会返回undefined,和action.payload的ID值比对永远不相等,自然返回-1。

修复方法:

把removeFav中的查找逻辑直接比对值即可:

const index = state.cardFavId.findIndex(
  (cardItem) => cardItem === action.payload
);

你也可以直接用更简洁的filter方法完成移除,不需要手动找索引操作数组(RTK的createSlice支持直接修改状态,也不需要手动拷贝数组):

removeFav: (state, action) => {
  console.log(action.payload, "payload remove pressed");
  state.cardFavId = state.cardFavId.filter(id => id !== action.payload)
}

场景2:调用removeFav时传参错误

如果你的cardFavId里存的确实是带id属性的对象,那就是你调用removeFav的时候传的不是ID值,而是整个对象,此时对象.id === 完整对象的比对永远不成立。

修复方法:

找到你调用removeFav的代码,把参数改为对象的id属性即可,示例:

// 错误写法
dispatch(removeFav(cardItem))
// 正确写法
dispatch(removeFav(cardItem.id))

报错截图

报错截图


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:45:03