js拓展运算符拷贝问题

项目场景:

项目中分数公式编辑功能,深拷贝数据


问题描述

使用React Hooks封装了一个关于分数运算的组件,在接收计算参数props中的parameters对象,oldParams深拷贝对象,更改parameters对象后oldParams的属性值也会随之更改。测试oldParams.current和 parameters 不全等。

  const [, setUpdate] = useReducer((x) => x + 1, 0);
  const changedParams = useRef({} as ComposeParameter);
  const oldParams = useRef({} as ComposeParameter);

  const handleValueChange = (value: number, name: string) => {
    parameters[name].value = value;
    setUpdate();
  };

  useEffect(() => {
    oldParams.current = { ...parameters };
  }, [parameters]);

原因分析:

(…)运算符不会对嵌套的数据进行深度拷贝,oldParams.current和 parameters 不全等,但是oldParams.current.xx === parameters.xx 是相等的,由此可见(…)运算符对嵌套对象拷贝的时候类似于浅拷贝。两个对象内存地址不同,但下面的属性指向同一地址。

在这里插入图片描述


解决方案:

我认为比较简单的方法JSON深拷贝,不然写个深拷贝函数或者重新整理一下数据。

 useEffect(() => {
    oldParams.current = JSON.parse(JSON.stringify(parameters));
  }, [parameters]);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值