vue深拷贝和浅拷贝(js改一个对象的值,另一个对象的值也发生变化)

本文探讨了在Vue项目中使用v-model时遇到的数据绑定问题,即修改addForm时已push到data1中的数据也随之变化。通过分析深浅拷贝原理,提供了解决方案:利用JSON.stringify和JSON.parse实现深拷贝。

在项目当中遇到这样一个问题,我是用v-model跟这个addForm绑定一些值,添加一行的时候把这个addForm push到data1里面,可是后来发现,当我改了addForm的属性的时候,data1里面已经push进去的数据也全都会随着addForm的改变而改变,看了好久,恍然大悟,发现会不会是深浅拷贝的问题,试了一下,果然是
在这里插入图片描述
在这里插入图片描述

1.原理

  • 浅拷贝:新对象赋值,只是取的旧对象栈中的值,也就是引用对象的值。上述问题也就是连指向都复制了,所以造成数据全都改变
  • 深拷贝:会在堆里边开辟一个空间,存放自己的对象值

2.解决办法

let form = JSON.parse(JSON.stringify(this.addForm));
          this.data1.push(form);

JSON.stringify()对象转为串,JSON.parse()串转为对象,JSON操作是深拷贝操作,这样转化一下就好了

Vue 3 与 TypeScript 的开发中,如果需要修对象内部的数组,并确保原始数据与副本之间互不影响,通常会使用深拷贝技术。由于 JavaScript 中的对象数组是引用类型,直接赋会导致新旧变量指向同一内存地址,因此对数组或对象的修会同时影响到原数据 [^2]。 ### 使用 Lodash 的 `cloneDeep` 实现深拷贝 可以通过第三方库 `lodash` 提供的 `cloneDeep` 方法实现完整的深拷贝操作,从而安全地修对象中的数组内容而不影响原始数据: ```ts import { cloneDeep } from 'lodash'; const originalData = { list: [1, 2, 3] }; const copiedData = cloneDeep(originalData); copiedData.list.push(4); console.log(originalData.list); // 输出 [1, 2, 3] console.log(copiedData.list); // 输出 [1, 2, 3, 4] ``` 该方式适用于嵌套结构较为复杂的对象,能够确保每一层的数据都被独立复制 [^3]。 ### 手动实现浅层深拷贝(适用于简单结构) 对于仅包含一层数组的对象,也可以通过扩展运算符或 `slice()` 方法进行浅拷贝: ```ts const originalData = { list: [1, 2, 3] }; const copiedData = { list: [...originalData.list] }; copiedData.list.push(4); console.log(originalData.list); // 输出 [1, 2, 3] console.log(copiedData.list); // 输出 [1, 2, 3, 4] ``` 此方法不适用于嵌套数组或对象,否则仍会出现引用共享的问题。 ### 在响应式上下文中使用深拷贝 当使用 `reactive` 或 `ref` 创建响应式对象时,若需修其内部数组并避免触发不必要的副作用,建议先进行深拷贝再操作副本: ```ts import { reactive } from 'vue'; import { cloneDeep } from 'lodash'; const state = reactive({ items: [10, 20, 30] }); const modifiedItems = cloneDeep(state.items); modifiedItems.push(40); state.items = modifiedItems; // 替换为新的数组以触发响应式更新 ``` 这种方式可以确保每次变更都基于一个全新的数组实例,从而避免因引用相同而引发的潜在问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值