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

如何避免state突变?批量更新日期时的状态异常求助

修复不可变状态修改问题

问题出在你直接修改了state.items[id]内部的属性,虽然最后展开了state.items,但内部的对象引用还是没变,所以导致了意外的变更。正确的做法是为每个要修改的对象创建新的副本,而不是直接修改原对象。

修改后的代码如下:

const allIds = getSubTasksId(Object.values(state.items), payload.id);
// 遍历allIds,逐个创建新的对象副本
const updatedItems = allIds.reduce((acc, id) => {
  const item = state.items[id];
  return {
    ...acc,
    [id]: {
      ...item,
      date: {
        ...item.date,
        current: payload.date
      }
    }
  };
}, { ...state.items });

return {
  ...state,
  items: updatedItems
};
  • 用reduce替代forEach,避免直接修改原state对象
  • 对每个要修改的item,先展开原item,再展开date对象,最后替换current属性
  • 初始值用{ ...state.items }确保原items对象不被修改

这样做能保证所有层级的对象都是新的引用,彻底避免可变状态带来的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:01:25