关于
浅拷贝
与深拷贝
的基础知识可参考【JS学习】–深拷贝与浅拷贝_Sam9029的博客-CSDN博客
关于
ref
和reactive
的基础知识可参考【Vue3-响应式工具API】ref 和 reactive 使用_Sam9029的博客-CSDN博客
在Vue3 项目 使用 中 响应式数据(主要是引用数据类型
) 进行深拷贝,遇到了一些问题,也收获一些经验方法,主要介绍在 vue3 项目中 使用 深拷贝的 方法 以及注意事项
structuredClone()
会使得Vue 抛出报错,(目前不知道为什么无法使用,暂时记住不要使用即可)(本文浅解,存在诸多不足,各种细节还有待完善)
JSON.parse(JSON.stringify(Obj))
JSON序列化 无法拷贝函数(一般也不会写函数进去)
JSON序列化 会忽略属性值为 undefined的属性
<script setup>
import {ref,reactive} from 'vue'
let refObj = ref({
data:[1,2],
meta:{
data:1
},
undefined:undefined
})
console.log(refObj.value) //24行
console.log(JSON.parse(JSON.stringify(refObj.value))) //25行
</script>
Target
中查看for……in
手写深拷贝函数 (若需要同时拷贝函数,值为undefined的属性)<script setup>
import {ref,reactive} from 'vue'
let refObj = ref({
data:[1,2],
meta:{
data:1
},
undefined:undefined,
null:null
})
console.log("元数据====",refObj.value)
console.log("JSON序列化拷贝====",JSON.parse(JSON.stringify(refObj.value)))
console.log("手写深拷贝====",deepCopy(refObj.value))
// 手写深拷贝
export function deepClone(obj) {
//判断 传入对象 为 数组 或者 对象
var result = Array.isArray(obj) ? [] : {};
// for in 遍历
for (var key in obj) {
// 判断 是否 为自身 的属性值(排除原型链干扰)
if (obj.hasOwnProperty(key)) {
// 判断 对象的属性值 中 存储的 数据类型 是否为对象
if (typeof obj[key] === 'object') {
// 有可能等于 null
if (obj[key] === null ) {
result[key] = null
continue
}
// 递归调用
result[key] = deepClone(obj[key]); //递归复制
}
// 不是的话 直接 赋值 copy
else {
result[key] = obj[key];
}
}
}
// 返回 新的对象
return result;
}
</script>
structuredClone()
会使得Vue 抛出报错,(目前不知道为什么无法使用,暂时记住不要使用即可)ref 定义的响应式数据(引用数据类型)
的深拷贝进行说明,同理对于 reactive 定义的响应式数据的
同样有效!!!