vue检测数据变化的原理

news2024/11/25 10:05:32

vue监测数据变化的原理

vue会监视data中所有层次的数据。

监测对象类型的数据

原理

vue监测对象类型的数据通过setter实现,且要在new Vue时就传入要监测的数据。

对象中后追加的属性,Vue默认不做响应式处理;如需后续添加的属性做响应式,请使用如下API: Vue.set(target,propertyName/index,value)vm.$set(target,propertyName/index,value)

图例分析

image-20230716210922128

在第一步加工(数据劫持)中,vue给每一个数组(由data对象中所有的属性而形成一个数组)属性都添加了get和set方法,这是实现检测数据变化的关键。

待补充…

Vue.set()方法

为什么需要这个方法?

直接修改没有被Vue监控的内容不会引起页面重新渲染。

当data中的数据已经定好之后,想再往里面添加属性就不会这么容易了 (在开发人员的角度,在代码中加是可以的;但是是在用户角度,那么就需要考虑不在代码层面去操作,而是把代码中写好程序实现在页面操作添加属性这一功能) ;

vue实例中的属性是从 _data 中通过数据代理生成的,而 _data中属性的方法是在生成vue实例之前加工中赋予的;

后面如果再加属性;不能直接把属性添加到实例根部(这样会导致_data中没有这个属性以及属性的get和set方法,因为是直接添加到实例根部了,没有经过_data )

image-20230715171535398

也不能直接把属性直接添加到 vm._data.xx=‘xxxx’;这样也是行不通的,因为这样添加出来的属性没有get和set方法,因为这两个方法是在vm实例生成之前做的加工中添加的。

image-20230715172014873

用法

通过Vue.set或者vm.$set我们可以给对象加入监视属性,从而达到修改数据重新渲染页面的效果

vue.set( )

image-20230715173741578

vm.$set( )

image-20230715173353664

实际应用

原理:点击按钮触发函数,在函数中使用vue.set对student添加‘sex‘属性,此时Vue会为其添加监视属性,并通过setter重新渲染页面

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Vue监测数据改变的原理</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<button @click="addSex">添加一个性别属性,默认值是男</button>
			<h2>姓名:{{student.name}}</h2>
			<h2 v-if="student.sex">性别:{{student.sex}}</h2>
		</div>
	</body>

	<script type="text/javascript">

		const vm = new Vue({
			el:'#root',
			data:{
				student:{
					name:'tom',
					age:{
						rAge:40,
						sAge:29,
					},
					friends:[
						{name:'jerry',age:35},
						{name:'tony',age:36}
					]
				}
			},
			methods: {
				addSex(){
					// Vue.set(this.student,'sex','男')
					this.$set(this.student,'sex','男')
				}
			}
		})
	</script>
</html>

监测数组类型的数据

通过包裹数组更新元素的方法实现,本质就是做了两件事:调用原生对应的方法对数组进行更新以及重新解析模板,进而更新页面。不能像监测对象那样修改。

这些原生的方法是 Array.prototype 原形上的方法,不是Array上的。

在Vue修改数组中的某个元素一定要用如下方法:

  • 使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
  • Vue.set() 或 vm.$set();用法同对象

特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

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

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

相关文章

吉林大学计算机软件考研经验贴

文章目录 简介政治英语数学专业课 简介 本人23考研&#xff0c;一战上岸吉林大学软件工程专硕&#xff0c;政治72分&#xff0c;英一71分&#xff0c;数二144分&#xff0c;专业课967综合146分&#xff0c;总分433分&#xff0c;上图&#xff1a; 如果学弟学妹需要专业课资料…

STM32MP157驱动开发——按键驱动(定时器)

“定时器 ”机制&#xff1a; 内核函数 定时器涉及函数参考内核源码&#xff1a;include\linux\timer.h 给定时器的各个参数赋值&#xff1a; setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data)&#xff1a;设置定时器&#xf…

HALCON error #5504 Image too large for this HALCON version in operator问题解决

目录&#xff1a; 一&#xff0c;问题概述&#xff1a;二&#xff0c;解决方法 一&#xff0c;问题概述&#xff1a; &#x1f300;当你直接或间接使用Halcon来做图像读取的时候&#xff0c;你可能遇到5504错误&#xff1a;HalconDotNet.HOperatorException:HALCON error #5504…

传奇开区网站打开跳转到别的网站处理教程

打开跳转被劫持到其他网站如何处理教程。 在解决劫持之前&#xff0c;需要先确定一下身份&#xff0c;如果是网站被劫持了&#xff0c;或者是访客访问自己的网站被劫持到其他的网站上&#xff0c;解决起来的方法不一样&#xff0c;下面一休分类分享给大家 1、访客身份处理方法…

opencv-19 图像色彩空间转换函数cv2.cvtColor()

cv2.cvtColor() 函数是 OpenCV 中用于图像颜色空间转换的函数。它允许你将图像从一个色彩空间转换为另一个色彩空间。在 Python 中&#xff0c;你可以使用这个函数来实现不同色彩空间之间的转换。 函数的基本语法为&#xff1a; cv2.cvtColor(src, code[, dst[, dstCn]])参数…

提高可视性的五大方法可增强 Horizon Cloud 下一代平台的性能和用户体验

我们在 VMware Explore US 2022 推出了 VMware Horizon Cloud 下一代平台。该平台为使用现代化虚拟桌面和应用的客户提供了一个新的混合型桌面服务&#xff08;DaaS&#xff09;架构&#xff0c;其围绕降低成本和提高可扩展性而构建。首次发布后&#xff0c;我们在 VMware Expl…

Java | 数组排序算法

一、冒泡排序 冒泡排序的基本思想是对比相邻的元素值&#xff0c;如果满足条件就交换元素值&#xff0c;把较小的元素移到数组前面&#xff0c;把较大的元素移到数组后面&#xff08;也就是交换两个元素的位置&#xff09;&#xff0c;这样较小的元素就像气泡一样从底部升到顶…

Python2、python3的安装

目录 一、环境搭建和简单命令 1. 关于交互模式 2.执行文件 3. print 4. 安装/卸载包 5. 查看安装了哪些包 6. 升级pip本身 7. 查看包的具体信息 8. 搜索含有nose 9. 所有包升级到最新版本 二、其他说明 1. –m的使用 2. 切换盘符 资料获取方法 一、环境搭建和简单…

vue3 项目打包后白屏

根据Vue3.x文档&#xff0c;在 vue.config.js/vite.config.ts 统一对webpack、跨域、端口号等属性进行配置。 1.在 vue.config.js/vite.config.ts添加publicPath属性并将值更改成 ‘./’ 在这里插入图片描述 2.若还没有解决就去路由中将history模式设置成默认的Hash模式&…

MATLAB与ROS联合仿真——Simulink生成ROS代码

当我们用simulink完成控制程序的搭建后&#xff0c;我们期望下一次可以直接对ROS进行控制&#xff0c;而不是每次都需要启动matlab和simulink&#xff0c;因此我们可以使用simulink的代码生成器&#xff0c;生成ROS代码 1、生成代码前需要进行如下的设置 &#xff08;1&#xf…

Fuzz测试:提升自动驾驶安全性

目录 什么是Fuzz测试&#xff1f; 自动驾驶的潜在风险 Fuzz测试&#xff1a;自动驾驶和车联网 Fuzz测试方法有以下几种&#xff1a; 资料获取方法 纵观近百年来汽车制造业的发展历程&#xff0c;产业跨进的每一步背后都有着技术创新作为支撑。汽车技术创新对世界经济、社会…

openCV-python安装

同样在anaconda下创建一个opencv-python环境 首先&#xff0c;打开anaconda navigator,然后创建一个环境来放opencv-python。 先点击下面的create&#xff0c;然后创建一个新环境。 选择你的python版本&#xff0c;这里我选择的是Python3.6。你也可以根据你的需要和习惯来选择…

【前后端数据交互】原生JS的Fetch请求封装

一、 AJAX 和 Fetch 对比 1.1 AJAX 概述 AJAX 是最早出现请求数据的方式&#xff0c;它不需要不需要刷新整个页面即可更新部分数据。 属于原生 JS 范畴 &#xff0c;技术核心是 XMLHttpRequest 对象。 AJAX 请求过程&#xff1a;创建 XMLHttpRequest 对象、连接服务器、发送请…

持续上新丨美格智能推出高算力AI模组SNM930,支持运行Linux Ubuntu

近日&#xff0c;美格智能宣布推出最新的高算力AI模组SNM930。该模组基于高端SoC高通QCS6490平台研发设计&#xff0c;支持WiFi 6E和蓝牙5.2连接&#xff0c;AI算力高达14Tops&#xff0c;是行业首款除支持Android外&#xff0c;还可以运行 Linux Ubuntu的智能模组&#xff0c;…

k8s常见的资源对象使用

目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…

【雕爷学编程】Arduino动手做(85)---LCD1602液晶屏模块7

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

js路由跳转时放弃正在pending的请求

在单页面应用中通常会对请求进行catch处理&#xff0c;如果用户打开a页面后页面发出了一个请求去获取aaa&#xff0c;但是由于某种原因请求一直在pending。此时用户又进入了b页面&#xff0c;在浏览时a页面的请求失败了&#xff0c;然后页面弹出提示&#xff1a;“数据aaa请求失…

pearcmd.php文件包含妙用

文章目录 pearcmd.php文件包含妙用利用条件原理利用config-createinstalldownload pearcmd关键词被ban参考 pearcmd.php文件包含妙用 利用条件 php.ini中register_argc_argvOn开启安装pecl/pear pecl是PHP中用于管理扩展而使用的命令行工具&#xff0c;而pear是pecl依赖的类…

【stable diffusion】保姆级入门课程05-Stable diffusion(SD)图生图-涂鸦重绘的用法

1.什么是涂鸦重绘 涂鸦重绘又称手涂蒙版。 简单来说&#xff0c;局部重绘手涂蒙版 就是涂鸦局部重绘的结合体&#xff0c;这个功能的出现是为了解决用户不想改变整张图片的情况下&#xff0c;对多个元素进行修改。 功能支持&#xff1a; 1.支持蒙版功能 2.笔刷决定绘制的元素…

如何在win10环境下配置强化学习gym库(使用vscode)

我是通过anacondavscode完成的gym库的使用&#xff0c;只是把案例跑起来了&#xff0c;具体步骤如下&#xff1a; 1、安装anaconda,参考链接&#xff1a;https://www.jianshu.com/p/2f3be7781451 我其实就是生安装的&#xff0c;也没有去配置环境啥的&#xff0c;就是下载安…