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

使用Redux实现撤销/重做功能时,克隆对象为何跟随原对象同步更新?

问题原因

你遇到的是典型的浅拷贝只复制引用不复制深层对象导致的问题:

  • Object.assign() 属于浅拷贝方法,仅会复制对象的第一层属性:如果属性值是基本类型(数字、字符串、布尔值等),会直接复制值;如果属性值是引用类型(对象、数组等),只会复制该引用类型的内存地址,不会递归复制内部的属性。
  • 你代码里的btn对象的style属性本身就是一个对象,浅拷贝得到的copy对象的style和原btn的style指向的是内存中完全相同的对象,后续你修改btn.style.backgroundColor本质是修改了这个共享对象的属性,copy.style读取到的自然是修改后的值。
修复方案

你需要对style属性单独做一层拷贝,修改拷贝逻辑即可:

setButtonBackgroundColor: (state, action) => {
  const btn = state.list.present.find(
    (btn) => btn.id === action.payload.id
  );
  // 对style也做一层浅拷贝,切断引用关联
  let copy = {
    ...btn,
    style: { ...btn.style }
  };
  state.list.past = [...state.list.past, copy];
  btn.style.backgroundColor = action.payload.backgroundColor;
}

如果你的style属性里还有更深层级的嵌套对象,需要根据嵌套层级对应做更深的拷贝,结构复杂的场景也可以直接使用成熟的深拷贝工具方法处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:24:05