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

Redux Toolkit 按ID删除状态数组项不生效,求代码问题排查

问题原因
  • 第一个问题:添加收藏时传入的payload结构嵌套了多余层级
    你调用addMovie时传入的是{ movie },也就是实际存入favoriteMovies数组的每个元素都是{ movie: 电影原始对象 }的嵌套结构,reducer删除逻辑里直接取movie.imdbID是拿不到值的,实际需要movie.movie.imdbID才能取到ID。
  • 第二个问题:删除时传入的payload格式和reducer接收逻辑不匹配
    你调用removeMovie时传入的是{ imdbID },此时action.payload是{ imdbID: '你的ID值' }的对象,而reducer里直接把这个对象和数组元素的imdbID字符串做全等比对,结果永远为假,过滤逻辑不会删除任何元素,这就是删除不生效的核心原因。
  • 重复新增的原因也很简单:删除操作没有生效,原数组里的对应项一直存在,再次触发添加逻辑就会多插入一条相同的记录。
修复方案

方案1:修改调用逻辑,保持reducer简洁(推荐)

修改dispatch触发部分的代码即可:

const handleAddFavorite = () => {
  // 去掉多余的对象包裹,直接传movie对象
  dispatch(addMovie(movie));
  setIsFavorite(true);
};
const handleRemoveFavorite = () => {
  // 去掉多余的对象包裹,直接传imdbID字符串
  dispatch(removeMovie(imdbID));
  console.log(imdbID);
  setIsFavorite(false);
};

修改后存入数组的元素就是原生的电影对象,删除时传入的payload是纯ID字符串,原有reducer逻辑可以直接正常运行。

方案2:调整reducer适配现有传参

如果不想修改调用逻辑,也可以调整reducer代码:

reducers: {
  addMovie: (state, action) => {
    // 取出嵌套的movie对象存入数组
    state.favoriteMovies = [...state.favoriteMovies, action.payload.movie];
  },
  removeMovie: (state, action) => {
    // 取出嵌套的imdbID做比对
    state.favoriteMovies = state.favoriteMovies.filter(
      (movie) => movie.imdbID !== action.payload.imdbID
    );
  },
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:36:00