为什么当我在 redux 中的这个 reducer 中的状态发生变化时,我的状态没有重新渲染

IT技术 reactjs redux
2021-04-28 12:59:41

这执行了逻辑,但我的组件没有重新渲染

 case CONSTANTS.DELETE_CARD:
      const newStateInit = state.map((list) => {
        if (list.id === action.payload.listID) {
          let delcardIndex = list.cards.findIndex((card) => {
            return card.id === action.payload.cardID;
          });
          list.cards.splice(delcardIndex, 1);
        }
        return list;
      });
      localStorage.setItem("todo-list", JSON.stringify(newStateInit));
      return [...newStateInit];
1个回答

我怀疑问题在于,即使状态是一个新的数组引用,特定的列表元素不是,事实上,正在与splice(回想一下,splice在适当的数组操作)发生变异传播newStateInit到一个新数组是多余的,因为Array.prototype.map已经返回了一个新的数组引用。

更新状态时,您通常还需要浅复制正在更新的任何嵌套状态。将现有状态newStateInit映射,并在匹配有效负载list映射先前的元素对象list.id,浅复制list元素并用于Array.prototype.filter返回一个新cards数组,其中当前与您尝试删除的 idcard.id 匹配。

case CONSTANTS.DELETE_CARD:
  const { cardID } = action.payload;
  const newStateInit = state.map((list) => {
    if (list.id === action.payload.listID) {
      return {
        ...list,
        cards: list.cards.filter(card => card.id !== cardID),
      };
    }
    return list;
  });
  localStorage.setItem("todo-list", JSON.stringify(newStateInit));
  return newStateInit;