新数据不影响原来的数据

问题描述

新数据修改时,原来的数据也会受影响

const obj1 = ref({ name: 'slx', age: 20 })const obj2 = obj1obj2.value.name = 'hhhh'console.log('obj1', obj1.value)console.log('obj2', obj2.value)

在这里插入图片描述

解决方法 (仅适用于对象

在这段代码中,obj1obj2 指向同一个响应式对象,因此修改 obj2 中的属性会同步反映到 obj1 中,导致原始对象被修改。如果需要修改 obj2 而不影响到 obj1,可以尝试以下 3 种方法:

  1. 手动复制新的对象

    const obj2 = ref({ ...obj1.value })
    obj2.value.name = 'hhhh'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式通过手动复制每个属性来创建一个新的对象,确保 obj1obj2 不再引用同一个对象,从而实现修改 obj2 而不影响 obj1
    在这里插入图片描述

  2. 使用 Object.assign 复制对象

    const obj2 = ref(Object.assign({}, obj1.value))
    obj2.value.name = 'hhhh'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式使用 Object.assignobj1 中的属性复制到一个新的对象中,并将其赋值给 obj2。由于 Object.assign 会创建一个新的对象,因此 obj1obj2 引用的是不同的对象,修改 obj2 不会影响到 obj1
    在这里插入图片描述

  3. 使用 lodash 库的 clone 方法复制对象

    import { clone } from 'lodash'
    const obj2 = ref(clone(obj1.value))
    obj2.value.name = 'hhhh'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式使用 lodash 库中的 clone 方法来复制对象。由于 clone 会创建一个新的对象,因此 obj1obj2 引用的是不同的对象,修改 obj2 不会影响到 obj1

希望这些方法能够帮助你解决问题。如果还有其他问题,请随时提问。

数组解决方法

问题描述

当数据是数组包对象时,就不好用

 const arr1 = ref([{ id: 1, name: 'slx', count: 2 },{ id: 2, name: 'slx', count: 8 }])//   const obj2 = obj1const arr2 = ref([...arr1.value])arr2.value[0].name = '庆余年'console.log('arr1', arr1.value)console.log('arr2', arr2.value)

在这里插入图片描述

解决👇

在这段代码中,obj1obj2 都是响应式对象,并且指向同一个数据数组。因此,修改 obj2 中的数据会同步反映到 obj1 中,导致原始数据被修改。如果需要修改 obj2 而不影响到 obj1,可以尝试以下 方法:

  1. 手动复制新的数据对象

    const obj2 = ref([{ ...obj1.value[0] },{ ...obj1.value[1] }
    ])
    obj2.value[0].name = '庆余年'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式通过手动复制每个数据对象来创建一个新的数组,确保 obj1obj2 不再引用同一个数据对象,从而实现修改 obj2 而不影响 obj1
    在这里插入图片描述

  2. 使用 JSON 序列化和反序列化复制数组

    const obj2 = ref(JSON.parse(JSON.stringify(obj1.value)))
    obj2.value[0].name = '庆余年'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式使用 JSON 序列化和反序列化操作来复制数组,即先将 obj1 转换为 JSON 字符串,再将其解析为数组对象。由于这个过程中会创建一个新的数组对象,因此 obj1obj2 引用的是不同的数组对象,修改 obj2 不会影响到 obj1

  3. 使用 lodash 库的 cloneDeep 方法复制数组

    import { cloneDeep } from 'lodash'
    const obj2 = ref(cloneDeep(obj1.value))
    obj2.value[0].name = '庆余年'
    console.log('obj1', obj1.value)
    console.log('obj2', obj2.value)
    

    这种方式使用 lodash 库中的 cloneDeep 方法来深度复制数组。由于 cloneDeep 会创建一个新的数组对象,因此 obj1obj2 引用的是不同的数组对象,修改 obj2 不会影响到 obj1

希望这些方法能够帮助你解决问题。如果还有其他问题,请随时提问。

简单的数组

使用 Array.from 复制数组

const array1 = ref([1, 2, 3, 4])
//   const array2 = array1
const array2 = ref(Array.from(array1.value))
array2.value[0] = 13234
console.log('array1', array1.value)
console.log('array2', array2.value)

这种方式使用 Array.from 将 array1 中的数据复制到一个新的数组中,并将其赋值给 array2。由于 Array.from 会创建一个新的数组对象,因此 array1array2 引用的是不同的数组对象,修改 array2 不会影响到 array1

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456704.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案

声明:原创文章,禁止转载! Android9~Android13 某些容量SD卡被格式化为内部存储时容量显示错误问题的研究与解决方案 分析Android11 系统对于EMMC/UFS作为内部存储、SD卡被格式化为内部存储、SD卡/U盘被格式化为便携式存储的不同处理 一.现象描述 实测Android9 Android10 A…

【Qt】常见问题

1.存在未解析的标识符 将build文件夹删掉重新编译。 2.左侧项目目录栏无法删除已添加项目 打开目标项目上一级的pro文件,将目标文件名字注释或者删除掉,最后保存,qt就会自动更新,将该项目隐藏掉。 3.在qt creator下添加槽函数…

mmdetection使用自己的voc数据集训练模型实战

一.自己数据集整理 将labelimg格式数据集进行整理 1.1. 更换图片后缀为jpg import os import shutilroot_path/media/ai-developer/imgfileos.listdir(root_path)for img in file:if img.endswith(jpeg) or img.endswith(JPG) or img.endswith(png):img_pathos.path.join(root…

【PTA选择题/基础夯实/期末复习】链表文件操作

2-1 对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()。 A.headNULL B.head→nextNULL C.head→nexthead D.head!NULL 2-2 链表不具有的特点是()。 A.可随机访问任一元素 B.插入、删除不需要移…

Express框架介绍—node.js

Express—Node.js 官网传送门(opens new window) 基于 Node.js 平台,快速、开放、极简的 Web 开发框架 Express 是用于快速创建服务器的第三方模块。 Express 初体验 基本使用 安装 Express: npm install express创建服务器,监听客户端请…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文:pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Shen Li 注意 在github中查看并编辑本教程。 先决条件: PyTorc…

Java13常用类3:Date类

4. Date类1:jdk1.8 之前 jdk1.8 之前的API: System类的currentTimeMillis():获取当前系统时间两个Date类: SimpleDateFormate类:用于格式化、解析Calendar日历类的使用:抽象类 4.1 两个Date类 时间戳&…

《动手学深度学习(PyTorch版)》笔记6.1

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中,for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码,从而实现各种复杂的功能。无论你是初学者还是资深开发者,掌握for循环的用法都是必不可少的。在本文中,我们…

第三百一十回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容,本章回中将介绍如何添加输入框默认值.闲话休提,让我们一起Talk Flutter吧。 1.…

【C++从0到王者】第四十一站:特殊类的设计

文章目录 一、设计一个类,不能被拷贝1.C98方法2.C11方法 二、设计一个类,只能在堆上创建对象1.析构函数私有化2.构造函数私有化 三、请设计一个类,只能在栈上创建对象四、设计一个类不能被继承1.C98方式2.C11方式 五、设计一个类,…

【JS逆向学习】今日头条

逆向目标 目标网页:https://www.toutiao.com/?wid1707099375036目标接口:https://www.toutiao.com/api/pc/list/feed目标参数:_signature 逆向过程 老规矩先观察网络请求,过滤XHR请求观察加密参数,发现Payload的_s…