父子组件的传参问题,一方改变,另一方随之改变

目录

1.问题

2.解决方案

3.前端中的深拷贝及浅拷贝问题总结


1.问题

在子组件中通过emit调用父组件的方法,并传递参数,当子组件中修改传递给父组件的参数时,即使没有将修改后的值传递给父组件,父组件中的值依然修改了。

原因是传递的参数是一个对象,是引用类型,父组件中定义的变量存储的是引用类型的地址,双方指向同一个内存地址,所以只要有一方改变,另一方也会随之改变。

2.解决方案

①JSON.parse(JSON.stringify(obj))

使用JSON进行处理,但是这种简单粗暴的方法有其局限性。当值为 undefined、function、symbol 会在转换过程中被忽略。所以,对象值有这三种的话用这种方法会导致属性丢失。

②进行深拷贝处理

3.前端中的深拷贝及浅拷贝问题总结

①简单对象的深拷贝及浅拷贝

  // 简单对象的浅拷贝let obj1 = {id: '1', name: '小孙', age: 18}let obj2 = obj1console.log(obj1 === obj2) // true 代表两个对象是同一个实例,对应内存中同一个内存地址,一方修改另一方随之改变obj1.id = '2'console.log(obj2) //Object { id: "2", name: "小孙", age: 18 }obj2.name="小林"console.log(obj1) //Object { id: "2", name: "小林", age: 18 }// 简单对象的深拷贝let obj3 = {...obj1}console.log(obj1 === obj3) // falselet obj4 = Object.assign({}, obj1)console.log(obj1 === obj4) // false

深拷贝中可以使用扩展运算符,生成新的对象,也可以使用Object的assign方法

扩展运算符说明:是三个点(...),它可以用于展开,复制,合并数组或者对象。如果有重复的内容,后面的覆盖前面的。当使用扩展运算符展开一个对象时,会创建一个新的对象,两个对象之间是独立的没有任何关联。

展开
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5, 6];
console.log(arr2); // 输出:[1, 2, 3, 4, 5, 6]合并
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combinedArr = [...arr1, ...arr2];
console.log(combinedArr); // 输出:[1, 2, 3, 4, 5, 6]复制
const arr1 = [1, 2, 3];
const arr2 = [...arr1];
console.log(arr2); // 输出:[1, 2, 3]

②简单数组的深拷贝和浅拷贝

  // 简单数组的浅拷贝let arr1 = ['1', '2', '3', '4']let arr2 = arr1console.log(arr1 === arr2)  // true 代表两个对象是同一个实例,对应内存中同一个内存地址// 简单数组的深拷贝let arr3 = arr1.concat()console.log(arr1 === arr3) // falselet arr4 = arr1.slice(0)console.log(arr1 === arr4) // falselet arr5 = Object.assign([], arr1)console.log(arr1 === arr5) // falselet arr6 = [...arr1]console.log(arr1 == arr6) // false

③复杂对象的深拷贝及浅拷贝

  // 复杂对象中的外层对象的深拷贝,内层对象或数组的浅拷贝let obj10 = {info:{id:'1',name:'小李',age:25},ke:['1','2','3','4']}let obj11 = {...obj10}console.log(obj10 === obj11) // falseconsole.log(obj10.info === obj11.info)  // trueconsole.log(obj10.ke === obj11.ke) // true// 如只做了外层对象或者数组的深拷贝,但是内部的对象和数组是浅拷贝,一方发生改变,另一方随之改变// 复杂对象中的外层对象的深拷贝,内层对象或数组的深拷贝let obj12 = {}Object.entries(obj10).forEach(([key,val]) =>{if(Object.prototype.toString.call(val) == '[object Object]'){obj12[key] = {...val}}else if(Object.prototype.toString.call(val) == '[object Array]'){obj12[key] = val.concat()}})console.log(obj12)console.log(obj12 === obj10) //falseconsole.log(obj10.info === obj12.info)  // falseconsole.log(obj10.ke === obj12.ke) // false

需要注意的是,如果对象内嵌套数组或者对象,如果只使用扩展运算符,只是对外层的对象做了深拷贝处理,但是对象内的数组或者对象,依然是浅拷贝,所以需要循环进行处理。

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

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

相关文章

Unity XR Interaction Toolkit设置或监听手柄按键事件(三)

提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、XRI Default Input Actions1.导入官方案例2.设置控制器绑定,如手柄、主/辅助按钮、操纵杆等1.要设置控制器绑定,如左右手 手柄、主/辅助按钮、操纵杆等…

转换,模糊查询属性,校验html写法

element ui 模糊查询 filterable 表单规则 :rulesrules el-form-item中的prop绑定的属性写规则rules blur 失去焦点事件 forcus 获取焦点事件 映射转换 function mappingFn(code){ let arr mappingList.value.map((item,index)>{ if(item.codecode){ r…

[k8s源码]8.deltaFIFO

deltaFIFO DeltaFIFO: 这是一个特殊类型的队列,它结合了FIFO(先进先出)队列的特性和增量(Delta)处理的能力。DeltaFIFO 中是按顺序存储的,但它们不必严格按照发生的顺序逐个处理。这种设计提供了处理的灵…

nosql--redis

nosql--不仅仅是sql,是所有非关系型数据库的统称 常用的NOSQL产品 redis [企业使用频率很高] mongodb hbase [适合大数据] redis redis可以用作数据库,缓存和消息代理,而且里面可以存储多种数据类型,提供了高可用机制 安装redi…

【C++中线程学习】

1、多线程 C11之前没有引入线程的概念&#xff0c;如果想要实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthead.h>&#xff0c;或者windows下的<windows.h>。 C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread.h…

Python中的异常处理与调试技巧

在Python编程中&#xff0c;异常处理&#xff08;Exception Handling&#xff09;和调试&#xff08;Debugging&#xff09;是两个至关重要的技能&#xff0c;它们帮助开发者识别并修复代码中的问题&#xff0c;确保程序的稳定性和可靠性。本文将详细介绍Python中的异常处理机制…

浅谈机器学习与深度学习的区别?

深度学习与机器学习是人工智能&#xff08;AI&#xff09;领域的两个重要分支&#xff0c;它们在数据处理、硬件依赖以及应用范围等方面有显著的区别。具体分析如下&#xff1a; 1. 数据处理 机器学习&#xff1a;机器学习通常需要较少的数据来训练模型&#xff0c;因为它使用…

在Windows下部署jar包,关闭命令提示符可以后台运行

前言 大多数情况下&#xff0c;都是选用Linux作为服务器部署服务&#xff0c;在Linux中通过以下命令运行 nohup java -jar xxxxx-1.0-SNAPSHOT.jar 但是有时由于其他原因&#xff0c;或本地测试&#xff0c;或云服务器使用Windows server等等&#xff0c;需要在Windows上面运…

matlab仿真 数字基带传输(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第六章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all Fd1;%符号采样频率 Fs10;%滤波器采样频率 r0.2;%滤波器滚降系数 delay4;%滤波器时延 [num,den]rcosine(Fd,Fs,defau…

Python读取grib数据获取变量推荐姿势

前情提要 最近使用的EC和GFS预报数据给的都是grib2格式的&#xff0c;之前用惯nc格式的&#xff0c;python读取grib2数据的时候还走了些弯路&#xff0c;看到很多博客上给的教程其实不能满足我的需求&#xff0c;现在搞明白了分享一下 pygrib安装 第一个问题就是我电脑上pyg…

通信原理实验六:实验测验

实验六 实验测验 一&#xff1a;测验内容和要求 测试需要完成以下几个步骤&#xff1a; 配置好以下网络图&#xff1b;占总分10%&#xff08;缺少一个扣一分&#xff09;根据下面图配置好对应的IP和网关以及路由等相关配置&#xff0c;保证设备之间连通正常&#xff1b;占总…

领略诗词之妙,发觉生活之美。

文章目录 引言落霞与孤鹜齐飞,秋水共长天一色。野渡无人舟自横。吹灭读书灯,一身都是月。我醉欲眠卿且去,明朝有意抱琴来。赌书消得泼茶香,当时只道是寻常。月上柳梢头,人约黄昏后。最是人间留不住,朱颜辞镜花辞树。山中何事?松花酿酒,春水煎茶。似此星辰非昨夜,为谁风…

用Swagger进行后端接口测试的实战操作

目录 一.什么是Swagger&#xff1f; 二.Swagger的使用操作流程&#xff1a; 1.在pom.xml配置文件导入 Knife4j 的依赖&#xff1a; 2.在config配置类中加入 Knife4j 的相关配置并设置静态资源映射&#xff08;否则接口文档无法访问&#xff09;&#xff1a; 三.Swagger的四个…

redis构建集群时,一直Waiting for the cluster to join

redis构建集群时&#xff0c;一直Waiting for the cluster to join 前置条件参考 前置条件 这是我搭建的集群相关信息&#xff0c;三台虚拟机&#xff0c;分别是一主一从。在将所有虚拟机中redis服务器用到的tcp端口都打开之后&#xff0c;进行构建集群。但是出现上面的情况。 …

node.js包管理工具对比

1. NPM&#xff08;Node Package Manager&#xff09; 特点&#xff1a; 官方工具&#xff1a;由 Node.js 官方提供的默认包管理工具。命令行工具&#xff1a;常用命令包括 npm install、npm update、npm publish 等。NPM 注册表&#xff1a;提供了一个庞大的开源包生态系统&…

【llama3.1】ollama的使用--本地部署使用llama3.1模型

快速入门 安装完成ollama后,在命令行窗口输入 ollama run llama3 上图表示 Ollama 正在下载 llama3 任务所需的资源文件,并显示了当前的下载进度、速度和预计剩余时间。这是 Ollama 在准备运行 llama3 任务之前所需的步骤。 上面的步骤完成后,就可以在本地进行聊天了,…

Chart.js 环形图

Chart.js 环形图 介绍 Chart.js 是一个强大的 JavaScript 图表库&#xff0c;它允许开发者轻松地在网页上创建和自定义各种图表。环形图&#xff08;也称为饼图或甜甜圈图&#xff09;是 Chart.js 支持的一种图表类型&#xff0c;用于展示数据在整体中的占比关系。环形图通过…

基于 HTML+ECharts 实现的数据可视化大屏案例(含源码)

数据可视化大屏案例&#xff1a;基于 HTML 和 ECharts 的实现 数据可视化已成为企业决策和业务分析的重要工具。通过直观、动态的图表展示&#xff0c;数据可视化大屏能够帮助用户快速理解复杂的数据关系&#xff0c;发现潜在的业务趋势。本文将介绍如何利用 HTML 和 ECharts 实…

区块链和数据要素融合的价值及应用

一、数据要素面临的关键障碍 在构建数据要素基石的过程中&#xff0c;首要任务是明确并解决产权架构的难题&#xff0c;特别是使用权的确立与流转机制的顺畅&#xff0c;此乃数字经济蓬勃发展的命脉所在。一个高效的数据流转体系对于激发数据潜能、加速经济发展及优化数据资源…

JVM系列(三) -类加载器及双亲委派模型介绍

在之前的文章中&#xff0c;介绍了类的加载过程中&#xff0c;我们有提到在加载阶段&#xff0c;通过一个类的全限定名来获取此类的二进制字节流操作&#xff0c;其实类加载器就是用来实现这个操作的。 在虚拟机中&#xff0c;任何一个类&#xff0c;都需要由加载它的类加载器…