vue响应式详解

1. 响应式的定义

我们都知道,vue是基于javascript的,那我们使用一段javascript代码来描述响应式

let a = 1,b = 1,c;
c = a + b;
console.log(c) // 输出 2
// 改变 a的值
a = 3;
// 重新给c赋值 即把  c = a + b; 再执行一遍c的值才能变为 4
// c = a + b;
// 再次输出c
console.log(c) // 输出 2

看到没有,c的值并没有随着a的值或者b的值的改变而改变,这就不是响应式的。
故本人粗略定义一下 当一个变量依赖于其他变量时,其他任意一个变量的改变,这个变量也会自动做出相应的改变即变量会随着依赖项变量的改变而自动改变。

vue2和vue3的响应式实现有什么区别?

Vue2的响应式是基于Object.defineProperty实现的
Vue3的响应式是基于ES6的Proxy来实现的

vue2

Vue2的响应式是基于Object.defineProperty的,那我就拿Object.defineProperty来举个例子

// 响应式函数
function reactive(obj, key, value) {Object.defineProperty(data, key, {get() {console.log(`访问了${key}属性`)return value},set(val) {console.log(`${key}由->${value}->设置成->${val}`)if (value !== val) {value = val}}})}const data = {name: '林三心',age: 22}Object.keys(data).forEach(key => reactive(data, key, data[key]))console.log(data.name)// 访问了name属性// 林三心data.name = 'sunshine_lin' // 将name由->林三心->设置成->sunshine_linconsole.log(data.name)// 访问了name属性// sunshine_lindata.grade = 80;console.log(data.grade) // 80data.grade = 90;console.log(data.grade) // 90

data新增了grade属性,进行访问和设值,但是都不会触发get和set,所以弊端就是:Object.defineProperty只对初始对象里的属性有监听作用,而对新增的属性无效。这也是为什么Vue2中对象新增属性的修改需要使用Vue.$set来设值的原因。

vue3

const data = {name: '林三心',age: 22
}function reactive(target) {const handler = {get(target, key, receiver) {console.log(`访问了${key}属性`)return Reflect.get(target, key, receiver)},set(target, key, value, receiver) {console.log(`${key}由->${target[key]}->设置成->${value}`)// 注意定义 Proxy 代理对象的 set 的时候,要返回 return true 不然报错  // 解决 https://blog.csdn.net/LawssssCat/article/details/104561640return Reflect.set(target, key, value, receiver)}}return new Proxy(target, handler)
}const proxyData = reactive(data)console.log(proxyData.name)
// 访问了name属性
// 林三心
proxyData.name = 'sunshine_lin'
// 将name由->林三心->设置成->sunshine_lin
console.log(proxyData.name)
// 访问了name属性
// sunshine_linproxyData.grade = 80; // 将grade由->undefined->设置成->80
console.log(proxyData.grade) // 访问了grade属性 80proxyData.grade = 90; // 将grade由->80->设置成->90
console.log(proxyData.grade) // 访问了grade属性 90

在这里插入图片描述
参考大神博客
参考vue3官网
至于vue3具体的实现代码过于八股文,有兴趣的朋友可以看看。

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

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

相关文章

小白也可以玩转CMake之常用必备

目录 1.设置编译器flags2.设置源文件属性3.链接器标志4.Debug与Release包 今天,分享一篇工作中经常用到的一些CMake命令,看完就学会了哦,更多CMake与C内容也期待加入星球与我一起学习呀~ 1.设置编译器flags 例如:设置C标准&#x…

C高级shell脚本

#!/bin/bash function fun() {sum0i0b($*)while [ $i -lt ${#b[*]} ]do((sum ${b[i]}))((i))doneecho $sum }read -p "请输入数组" -a a fun ${a[*]}function fun2() {aid -ubid -gecho $a $b } p(fun2) uid${p[0]} pid${p[1]} echo $uid $pidXMind

飞行动力学 - 第20节-横向静稳定性 之 基础点摘要

飞行动力学 - 第20节-横向静稳定性 之 基础点摘要 1. 横向静稳定性2. 横向静稳定准则3. 横向静稳定性的组成4. 参考资料 1. 横向静稳定性 2. 横向静稳定准则 对于横向静稳定性飞机,右滚转扰动会产生正侧滑,飞机产生左滚恢复力矩(负),即 Δ …

java 身份证号码验证

需要编号文件 编号文件部分内容如下 11:北京市 1101:市辖区 110101:东城区 110102:西城区 110105:朝阳区 110106:丰台区 110107:石景山区 110108:海淀区 ...... 编号文件内容比较多 csdn点击 下载地址 java代码如下 import java.io.*; import java.text.ParseException; im…

github 创建自己的分支 并下载代码

github创建自己的分支 并下载代码 目录概述需求: 设计思路实现思路分析1.进入到master分支,git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候,会结构体里的字段边上加tag,有没有什么办法可以获取到这个tag的内容呢? 举例 tag信息可以通过反射(reflect包)内的方法获取,通过一个例子加深理解。 package mainimport (&quo…

Linux 6.6 初步支持AMD 新一代 Zen 5 处理器

AMD 下一代 Zen 5 CPU 现已开始为 Linux 6.6 支持提交相关代码,最新补丁包括提供温度监控和 EDAC 报告等。 最新的 Linux 6.6 代码中已经加入了包括支持硬件监视器温度监控和 EDAC 报告的补丁。此外,新版本还加入了 x86 / misc 补丁,Phoronix…

初出茅庐的小李博客之根据编译时间生成软件版本号

为什么要软件版本号呢? 生成软件版本号是在软件开发和维护过程中非常重要的一项任务,它有很多意义和好处,同时也有多种常见的方法。 标识和追踪:软件版本号是唯一的标识符,用于区分不同版本的软件。这有助于开发人员和…

华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

CATIA Composer软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 CATIA(Computer-Aided Three-dimensional Interactive Application)是一款由法国达索系统公司开发的三维计算机辅助设计(CAD)软件。它是一种全面的产品开发解决方案,广泛…

13-JVM调优实战-3

上一篇:12-JVM调优实战-2 今天来介绍一款阿里巴巴的调优工具。 Arthas详解 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细&am…

约瑟夫环(循环列表实现)

约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈。每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个…

docker使用(二)提交到dockerhub springboot制作镜像

docker使用(二) dockerhub创建账号创建存储库成功!开始推送获取image名 提交成功SpringBoot项目制作Dockerfile镜像部署打jar包 dockerhub创建账号 (自认为可以理解为github一类的东西) 单击创建存储库按钮。 设定存…

uniapp 小程序 全局弹窗 每个需要使用的页面都不用再引用

文章目录 创建组件在项目的根目录下的vue.config.vue中配置页面中使用 使用全局组件,先声明全局组件 与普通的组件声明不同之处在于 1:目录形式 2:声明引用方式 创建组件 在components目录中创建组件目录/组件vue,如下 注意需要同…

面向Ai设计的Mojo编程语言支持下载,当前只有Linux系统版本

据了解,Mojo是Modular AI公司开发的专门面向AI设计的编程语言,号称比Python快68000倍。 Mojo现已开放本地下载运行,除了编译器之外,Mojo SDK还包括一整套开发者和IDE工具,并用来构建和迭代 Mojo应用。 公司方面表示&…

二.RocketMQ基础概念及名词说明

RocketMQ基础概念及名词说明 一:RocketMQ基本概念1.消息(Message)2.生产者(Producer)3.消费者(Consumer)4.分组(Group):4.主题(Topic)5.标签(Tag)6.队列(Queue&#xff0…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的,跨平台的解决方案,记录,转换和流音频和视频。 官网:https://ffmpeg.org/ 二、安装 1、Linux: sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

Charles基础使用指南

##Charles 基本使用指南 Charles 在本地构建一个HTTP代理服务器,可以实现对HTTP、HTTPS请求的抓取,也就是我们常说的抓包,以及对请求响应的修改等。 Charles 官网地址 https://www.charlesproxy.com/ ###一、移动端的抓包实现 1. PC端开启…

C++重载输入和输出运算符

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 …

UIScrollView setContentOffset: animated:

项目中遇到感觉一切都设置对了&#xff0c;但是看到的效果和预想的不一样。 后来查询了一番&#xff0c;才知道问题所在&#xff0c;现在记录一下&#xff0c;担心过后又忘了。 最初的问题是这样的&#xff0c;这个热度只有在评论里有&#xff0c;点击赞的时候&#xff0c;热度…