当前位置: 首页 > news >正文

vue2和vue3双向绑定的原理

Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。

Vue 2 双向绑定的原理

在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者模式。以下是 Vue 2 双向绑定的工作原理:

  1. 数据劫持:Vue 2 使用 Object.defineProperty 劫持数据对象的属性,通过 getter 和 setter 拦截属性的读取和赋值操作。
  2. 依赖收集:在 getter 中,Vue 2 会收集依赖(即观察者),将依赖添加到一个依赖管理器(Dep)中。
  3. 派发更新:在 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 提供了更强大和灵活的方式来拦截和定义基本操作(如属性读取、赋值、删除等)。

  1. 数据劫持:Vue 3 使用 Proxy 劫持整个对象,而不是单个属性。
  2. 依赖收集:在 Proxy 的 get 拦截器中,Vue 3 会收集依赖,将依赖添加到一个依赖管理器(ReactiveEffect)中。
  3. 派发更新:在 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 更加强大和灵活,主要体现在以下几个方面:

  1. 劫持整个对象:Proxy 可以劫持整个对象,包括新增和删除的属性,而 Object.defineProperty 只能劫持已有属性。
  2. 支持更多操作:Proxy 可以拦截和定义多种操作,而 Object.defineProperty 只能拦截属性的读取和赋值。
  3. 数组的处理:Proxy 可以直接劫持数组的各种操作,而 Object.defineProperty 需要手动处理数组方法的重写。
  4. 性能和代码简洁性: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招聘新员工,如何考察企业文化适配度

要解决文化适配性问题,那在招聘过程中一定要明确企业核心价值观。比如通过制定明确文化价值观手册的方式,向求职者展示企业的使命愿景和价值观。 目前最为理想的考察方式就是线上的人才测评,比如:采用职业价值观测评法&#xff0…...

AI算力「搅局」座舱SoC

对于芯片巨头来说,汽车是难以割舍的赛道。 这不仅仅是因为「车规级」向来是准入门槛最高的细分市场之一,更重要的原因来自于从PC、智能手机到智能汽车时代,芯片公司都在寻求成为新周期的标杆。 比如,从PC时代的「英特尔」到智能手…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...