vue2和vue3双向绑定的原理
Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。
Vue 2 双向绑定的原理
在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者模式。以下是 Vue 2 双向绑定的工作原理:
- 数据劫持:Vue 2 使用 Object.defineProperty 劫持数据对象的属性,通过 getter 和 setter 拦截属性的读取和赋值操作。
- 依赖收集:在 getter 中,Vue 2 会收集依赖(即观察者),将依赖添加到一个依赖管理器(Dep)中。
- 派发更新:在 setter 中,当数据发生变化时,Vue 2 会通知所有依赖进行更新,触发视图的重新渲染。
示例
let data = { message: 'Hello Vue 2!' };Object.defineProperty(data, 'message', {get() {// 依赖收集console.log('getter: ', data.message);return data.message;},set(newValue) {// 派发更新console.log('setter: ', newValue);data.message = newValue;// 通知视图更新}
});data.message = 'Hello World!';
Vue 3 双向绑定的原理
在 Vue 3 中,双向绑定主要依赖于 ES6 的 Proxy 对象。Proxy 提供了更强大和灵活的方式来拦截和定义基本操作(如属性读取、赋值、删除等)。
- 数据劫持:Vue 3 使用 Proxy 劫持整个对象,而不是单个属性。
- 依赖收集:在 Proxy 的 get 拦截器中,Vue 3 会收集依赖,将依赖添加到一个依赖管理器(ReactiveEffect)中。
- 派发更新:在 Proxy 的 set 拦截器中,当数据发生变化时,Vue 3 会通知所有依赖进行更新,触发视图的重新渲染。
示例
let data = { message: 'Hello Vue 3!' };const handler = {get(target, key) {// 依赖收集console.log('getter: ', target[key]);return target[key];},set(target, key, value) {// 派发更新console.log('setter: ', value);target[key] = value;// 通知视图更新return true;}
};const proxyData = new Proxy(data, handler);proxyData.message = 'Hello World!';
总结
- Vue 2:使用 Object.defineProperty 劫持数据对象的属性,通过 getter 和 setter 实现依赖收集和派发更新。
- Vue 3:使用 ES6 的 Proxy 对象劫持整个数据对象,通过 Proxy 的 get 和 set 拦截器实现依赖收集和派发更新。
Vue 3 的 Proxy 机制相比 Vue 2 的 Object.defineProperty 更加灵活和强大,能够更好地处理数组和对象的新增属性等情况,从而提升了性能和开发体验。
拓展
Proxy 相比 Object.defineProperty 更加强大和灵活,主要体现在以下几个方面:
- 劫持整个对象:Proxy 可以劫持整个对象,包括新增和删除的属性,而 Object.defineProperty 只能劫持已有属性。
- 支持更多操作:Proxy 可以拦截和定义多种操作,而 Object.defineProperty 只能拦截属性的读取和赋值。
- 数组的处理:Proxy 可以直接劫持数组的各种操作,而 Object.defineProperty 需要手动处理数组方法的重写。
- 性能和代码简洁性:Proxy 使代码更加简洁,性能也更好,而 Object.defineProperty 需要对每个属性进行劫持,代码复杂度和性能开销较大。
这些优势使得 Vue 3 在实现双向绑定时选择了 Proxy,从而提升了性能和开发体验。
相关文章:
vue2和vue3双向绑定的原理
Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。 Vue 2 双向绑定的原理 在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者…...
别为大文件烦恼!mp4文件太大怎么变小?3个管用方法
你是否曾经遇到过mp4视频文件过大的困扰?每当想要分享或存储mp4文件时,巨大的文件就成了阻碍。明明感觉感觉没占用多少空间,但是设备却常常出现空间过满警告。 没多少空间的设备真是让人大为恼火,没人想多花一份钱买设备。那么只…...
cocotb的接收和发送逻辑,还是没有弄明白
发送有两种方式 1、定义这样的发 通过前缀连接DUT里面的信号 发送的时候,通过.去访问就可以 2、如果是AXI总线,可以直接调用cocotb的库文件 AXIS总线可以包含以下的信号 通过这个类,可以产生一个AXIS的一帧数据 类的实现大概如下 然后也…...
XXL-JOB调度中心与执行器
XXL-JOB是一个轻量级的分布式任务调度平台,主要由调度中心和执行器两部分组成。下面详细讲解调度中心与执行器的功能和作用。 调度中心 调度中心是XXL-JOB的核心组件,负责任务的调度管理。其主要功能包括: 任务管理:调度中心提供…...
Notepad++ 8.6.9 (代码编辑) 绿色版
Notepad编辑器是一款非常流行的编辑软件,对于技术白菜来说,有这么个神器真是方便多了,Notepad界面简洁明了,而且可以定制界面,又支持多国语言,是站长们的得力助手。免费、开源、绿色,对中文支持…...
【例003】利用MATLAB绘制有趣平面图形
题目: 用 ezplot 画出由方程 sin ( x 2 m y 2 1000 ) cos ( x y ) \sin(x^2\frac{my^2}{1000})\cos(xy) sin(x21000my2)cos(xy) 确定隐函数的图形。 求解: 我们分别取m为100,1000,10000不同的值,绘制不同情况下的图…...
Ignis公链探索生态建设新范式:产业区块链与GameFi双轨驱动
Ignis公链凭借其独特的技术架构,选择了产业区块链与GameFi这两个赛道作为生态建设的双轮驱动,逐步形成了一个多元化的Web3生态系统。 一、产业区块链的革新:Vessel Chain的成功案例 在产业区块链领域,Ignis公链通过推出Vessel Ch…...
河南测绘资质申请中的技术装备需求
技术装备要求概览 购置与测绘业务相适应的技术设备:需要购置与测绘业务相适应的技术设备,如全站仪、水准仪、GNSS接收机等。 需要建立技术装备清单,并确保这些设备处于良好的工作状态。 技术装备的精度要求:GNSS接收机、全站仪…...
如何使用C# 读写西门子PLC
在C# WPF应用程序中,与西门子S7系列PLC进行通信是一个常见的需求,尤其是在工业自动化领域。以下是三种实现WPF上位机与西门子S7系列PLC通信同步的方式,每种方式都提供了代码实例、优缺点和使用场景。 1. 使用S7.Net库 代码示例: // 创建PLC连接 var plc = new S7.Net.Pl…...
反向沙箱-安全上网解决方案
随着信息化的发展,企业日常办公越来越依赖互联网。终端以及普通PC终端在访问互联网过程中,会遇到各种各样不容忽视的风险,例如员工主动故意的数据泄漏,后台应用程序偷偷向外部发信息,木马间谍软件的外联,以…...
尚品汇-延迟插件实现订单超时取消(四十五)
目录: (1)延迟插件封装 (2)基于延迟插件测试 如何保证消息幂等性? (3)改造订单service-order模块-实现订单超时取消 (1)延迟插件封装 把消息带过去&#…...
欺诈文本分类检测(十一):LLamaFactory多卡微调
1. 引言 前文训练时都做了一定的编码工作,其实有一些框架可以支持我们零代码微调,LLama-Factory就是其中一个。这是一个专门针对大语言模型的微调和训练平台,有如下特性: 支持常见的模型种类:LLaMA、Mixtral-MoE、Qw…...
SprinBoot+Vue健康管管理微信小程序的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…...
C++基础类容详解
目录 知识点1 C的概述 1 C的特征 2 C程序的编辑、编译和执行 3 第一个C源程序 4 面向对象程序设计思想 4.1 面向对象程序设计思想初始 4.2 面向对象程序设计思想的核心 知识点2 C对C的扩展 1 作用域访问运算符(::) 2 名称空间域 2.1 创建名称空间域 2.2 已有名称空间…...
python基础(16面试题附答案一)
python系列文章目录 python基础(01变量&数据类型&运算符) python基础(02序列共性) python基础(03列表和元组) python基础(04字符串&字典) python基础(05集合set) pytho…...
Leetcode3256. 放三个车的价值之和最大 I
Every day a Leetcode 题目来源:3256. 放三个车的价值之和最大 I 解法1:贪心 从大到下排序矩阵所有值, 记为数组v。 转化此题:从r*c个数中选取3个数分别给到车1,车2,和车3,使得符合条件的三数之和最大。…...
Redis中String类型的基本命令
文章目录 一、String字符串简介二、常见命令setgetmgetmsetsetnxincrincrbydecrdecrbyincrbyfloatappendgetrangesetrangestrlen 三、命令小结四、字符串内部编码五、String典型使用场景1. 缓存(Cache)功能2. 计数功能3. 共享会话(Session)4. 手机验证码…...
2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟…...
HR招聘新员工,如何考察企业文化适配度
要解决文化适配性问题,那在招聘过程中一定要明确企业核心价值观。比如通过制定明确文化价值观手册的方式,向求职者展示企业的使命愿景和价值观。 目前最为理想的考察方式就是线上的人才测评,比如:采用职业价值观测评法࿰…...
AI算力「搅局」座舱SoC
对于芯片巨头来说,汽车是难以割舍的赛道。 这不仅仅是因为「车规级」向来是准入门槛最高的细分市场之一,更重要的原因来自于从PC、智能手机到智能汽车时代,芯片公司都在寻求成为新周期的标杆。 比如,从PC时代的「英特尔」到智能手…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
