当前位置: 首页 > news >正文

猿创征文|【vue3学习】vue3中实现深拷贝

【Vue3】Vue3 中实现响应式数据深拷贝(针对ref 和 reactive)

​ 关于 浅拷贝深拷贝 的基础知识可参考

【JS学习】–深拷贝与浅拷贝_Sam9029的博客-CSDN博客

​ 关于 refreactive 的基础知识可参考

【Vue3-响应式工具API】ref 和 reactive 使用_Sam9029的博客-CSDN博客


在Vue3 项目 使用 中 响应式数据(主要是引用数据类型) 进行深拷贝,遇到了一些问题,也收获一些经验方法,主要介绍在 vue3 项目中 使用 深拷贝的 方法 以及注意事项

  • 一:JSON序列化
  • 二:for……in 深拷贝手写函数
  • ❗特别注意!不能使用JS的自带APIstructuredClone() 会使得Vue 抛出报错,(目前不知道为什么无法使用,暂时记住不要使用即可)
  • 其他待发现方法🤑

(本文浅解,存在诸多不足,各种细节还有待完善)


目录

文章目录

  • 【Vue3】Vue3 中实现响应式数据深拷贝(针对ref 和 reactive)
    • 目录
    • @[toc]
    • 🦁方法一:JSON 序列化`JSON.parse(JSON.stringify(Obj))`
      • 实例
      • 结果
    • 🦁方法二:`for……in` 手写深拷贝函数 (若需要同时拷贝函数,值为undefined的属性)
      • 实例
      • 结果
      • **❗特别注意!不能使用JS的自带API`structuredClone()` 会使得Vue 抛出报错,(目前不知道为什么无法使用,暂时记住不要使用即可)**
    • 上诉谈论 使用 了 `ref 定义的响应式数据(引用数据类型)`的深拷贝进行说明,同理对于` reactive 定义的响应式数据的` 同样有效!!!

🦁方法一:JSON 序列化JSON.parse(JSON.stringify(Obj))

  • ❗注意,JSON序列化 无法拷贝函数(一般也不会写函数进去)
  • ❗特别注意,JSON序列化 会忽略属性值为 undefined的属性
  • 其他 缺点 参考 文章 【JS学习】–深拷贝与浅拷贝_Sam9029的博客-CSDN博客

实例

<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>

结果

  • ref 定义的对象 是由 Proxy 代理的,所有的值须在 Target 中查看
  • 可有图知,undefined 属性 在深拷贝时 丢失了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6fDb5mH-1662084661459)(C:\Users\Administrator\Downloads\21捕获.JPG)]


🦁方法二:for……in 手写深拷贝函数 (若需要同时拷贝函数,值为undefined的属性)

  • 此方法可 拷贝 函数 以及值为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))


 function deepCopy(obj) {
     //判断 传入对象 为 数组 或者 对象
     var result = Array.isArray(obj) ? [] : {};
     // for in 遍历
     for (var key in obj) {
         // 判断 是否 为自身 的属性值(排除原型链干扰)
         if (obj.hasOwnProperty(key)) {
             // 判断 对象的属性值 中 存储的 数据类型 是否为对象
             if (typeof obj[key] === 'object') {
                 // 递归调用
                 result[key] = deepCopy(obj[key]);   //递归复制
             } 
             // 不是的话 直接 赋值 copy
             else {
                 result[key] = obj[key];
             }
         }
     }
     // 返回 新的对象
     return result;
 }
</script>

结果

在这里插入图片描述


❗特别注意!不能使用JS的自带APIstructuredClone() 会使得Vue 抛出报错,(目前不知道为什么无法使用,暂时记住不要使用即可)


上诉谈论 使用 了 ref 定义的响应式数据(引用数据类型)的深拷贝进行说明,同理对于 reactive 定义的响应式数据的 同样有效!!!

相关文章:

  • TiUP 镜像参考指南
  • 鹏城AI靶场助力大规模高质量中文语料数据集安全开放
  • 安装node, 配置npm全局安装位置,安装Vue.
  • 神经网络理论及应用答案,神经网络理论名词解释
  • 国产香氛品牌别样的生意经
  • Java-基于SSM的健身后台管理系统
  • 【CCIE 实验】BGP 13条选路原则实验
  • 购买发票自动化软件(或者文档管理系统)需要注意的问题
  • 磁盘被未知资源耗尽lsof -n|grep deleted
  • 图观 | 快速评估图数据库何时适合使用?
  • Redis主从集群
  • 瑞吉外卖git
  • NAS媒体库资源归集整理工具nas-tools
  • ECCV 2022 | MVDG:一种用于域泛化的统一多视图框架
  • Gin源码之gin.Engine结构体及其方法
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript-Array类型
  • JavaScript学习总结——原型
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Octave 入门
  • Promise面试题2实现异步串行执行
  • windows下mongoDB的环境配置
  • 创建一种深思熟虑的文化
  • 构建工具 - 收藏集 - 掘金
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何编写一个可升级的智能合约
  • 山寨一个 Promise
  • 学习JavaScript数据结构与算法 — 树
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (02)vite环境变量配置
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)Java 简介
  • (23)Linux的软硬连接
  • (4)STL算法之比较
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (独孤九剑)--文件系统
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)负载均衡,回话保持,cookie
  • .NET 8.0 中有哪些新的变化?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [.net] 如何在mail的加入正文显示图片
  • [20170705]diff比较执行结果的内容.txt
  • [AX]AX2012 R2 出差申请和支出报告
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [Flex][问题笔记]TextArea滚动条问题
  • [HackMyVM]靶场 Quick3
  • [HDU 3555] Bomb [数位DP]
  • [IOI2007 D1T1]Miners 矿工配餐
  • [JavaWeb玩耍日记]Maven的安装与使用