大白话Vue2和Vue3双向数据绑定的原理
大白话Vue2和Vue3双向数据绑定的原理
下面用大白话来给你详细介绍一下Vue2和Vue3双向数据绑定的原理:
Vue2双向数据绑定原理
Vue2的双向数据绑定主要是通过Object.defineProperty()这个方法来实现的,就好像有一个小管家在帮你看着数据和页面。
- 数据劫持:Object.defineProperty()能给对象的属性添加 getter(获取值的方法)和 setter(设置值的方法)。Vue2会遍历数据对象的所有属性,用这个方法把它们都变成“特殊属性”。比如有个数据对象
data,里面有个属性message,Vue2就会给message加上getter和setter。当你读取message的值时,就会触发getter;当你给message赋值时,就会触发setter。这就好像小管家在你访问或修改数据的时候都能知道。 - 发布订阅模式:在Vue2里,还有一个叫做“观察者”的东西。数据变化时,setter会通知这些“观察者”,“观察者”再去通知依赖这个数据的视图进行更新。比如
message的值变了,setter就告诉“观察者”,“观察者”再告诉页面上显示message的地方,让它更新显示的内容。同样,当用户在页面上修改了数据,比如在输入框里改了message的值,这个变化也会通过“观察者”传给数据对象,实现双向数据绑定。 - 虚拟DOM:Vue2会把真实的DOM结构抽象成一个虚拟DOM树,当数据变化时,不会马上更新真实DOM,而是先在虚拟DOM上进行计算和比较,找出哪些地方需要更新,最后再一次性更新真实DOM。这样可以减少对真实DOM的操作,提高更新效率。
Vue3双向数据绑定原理
Vue3的双向数据绑定原理和Vue2有些不同,它用了Proxy来实现,就像是换了一个更厉害的小管家。
- Proxy代理:Proxy可以用来创建一个对象的代理,对这个对象的所有操作进行拦截和处理。Vue3用Proxy来代理数据对象,它比Object.defineProperty()更强大,能直接监听整个对象的变化,而不是像Vue2那样要一个属性一个属性地监听。比如还是有个
data对象和message属性,用Proxy代理data后,不管是访问还是修改data里的任何属性,Proxy都能知道,不需要像Vue2那样单独给每个属性设置getter和setter,就好像这个小管家能一下子管好多事情,不用一件一件去处理。 - 响应式系统:Vue3基于Proxy建立了一套响应式系统。当数据变化时,Proxy会拦截到变化,然后通知相关的组件进行更新。这个过程更加高效和灵活,能更好地处理复杂的数据结构和变化。
- 虚拟DOM:Vue3的虚拟DOM也有一些改进,它采用了更高效的算法来比较和更新虚拟DOM,比如静态提升、PatchFlag等技术,能更精准地找到需要更新的地方,进一步提高了更新效率。
总的来说,Vue2和Vue3的双向数据绑定都是为了让数据和视图能自动同步,只不过Vue3用了更先进的技术,在性能和功能上都有了一些提升。
Vue2和Vue3双向数据绑定耳的区别
咱来好好唠唠 Vue3 和 Vue2 双向数据绑定的区别,就像对比两个不同版本的智能管家,它们都能帮你管理数据和页面显示的同步,但各有各的特点。
实现原理的区别
Vue2:用“小侦探”逐个盯梢
Vue2 实现双向数据绑定主要靠 Object.defineProperty() 这个东西,你可以把它想象成一群小侦探。当你有一个数据对象,比如一个人的信息对象,里面有姓名、年龄这些属性。Vue2 会给每个属性都安排一个小侦探,这个小侦探会盯着属性的获取和修改操作。
比如说你读取姓名这个属性,小侦探就知道你在读取,然后可能做一些记录;要是你修改了姓名,小侦探马上就会发现,接着通知页面更新显示新的姓名。但这个方法有个问题,要是你突然给这个人的信息对象添加了一个新属性,比如“爱好”,原来的小侦探可管不着这个新属性,你得专门再请个小侦探来盯着它。
Vue3:用“超级管家”全方位监控
Vue3 用的是 Proxy 来实现双向数据绑定,Proxy 就像是一个超级管家。它不是一个属性配一个小侦探,而是直接把整个数据对象接管过来。不管你是读取对象里的哪个属性,还是修改属性,或者给对象添加新属性、删除属性,超级管家都能一下子察觉到。
比如说你还是那个包含个人信息的对象,超级管家能一下子管到对象的方方面面,不管对象怎么变,它都能及时发现并通知页面更新,不用像 Vue2 那样还得额外处理新属性的监控问题。
使用方式的区别
Vue2:固定的指令套路
在 Vue2 里,实现双向数据绑定主要靠 v-model 指令,它就像是一个固定的操作模式。在表单元素里用 v-model 就能把数据和表单的值关联起来。比如说有个输入框,你在输入框里输入内容,数据对象里对应的属性值就会跟着变;反过来,数据对象里的属性值变了,输入框里显示的内容也会更新。但 v-model 的用法比较固定,对于不同类型的表单元素,它的处理方式基本是定好的。
Vue3:更灵活的指令玩法
Vue3 里的 v-model 指令变得更灵活了。它不仅能像 Vue2 那样简单关联数据和表单,还能指定绑定的属性名。比如说你有一个自定义组件,你可以通过 v-model:propName 这种形式,让组件里的某个特定属性和外部的数据进行双向绑定。而且 Vue3 还有组合式 API,像 reactive 和 ref 这些东西,让你创建和管理响应式数据更自由。你可以根据自己的需求,更灵活地组织代码来实现双向数据绑定。
性能和功能上的区别
Vue2:性能有负担,功能有局限
Vue2 因为是给每个属性都安排小侦探,所以当数据对象的属性很多的时候,就需要很多小侦探,这会带来一定的性能开销。而且对于深层嵌套的对象,小侦探们得一层一层去盯,很麻烦,性能也会受影响。另外,在处理一些复杂的数据结构和动态属性的时候,Vue2 就有点力不从心了,需要额外写很多代码来处理。
Vue3:性能提升,功能更强大
Vue3 的超级管家直接管理整个对象,不需要给每个属性单独安排人盯着,性能开销就小了很多。对于深层嵌套的对象,超级管家也能轻松应对,不会像 Vue2 那样有性能问题。而且 Vue3 支持更多的数据结构,像 Map、Set 这些,还能很方便地处理动态属性的添加和删除,功能更强大,能满足更多复杂的开发需求。
相关文章:
大白话Vue2和Vue3双向数据绑定的原理
大白话Vue2和Vue3双向数据绑定的原理 下面用大白话来给你详细介绍一下Vue2和Vue3双向数据绑定的原理: Vue2双向数据绑定原理 Vue2的双向数据绑定主要是通过Object.defineProperty()这个方法来实现的,就好像有一个小管家在帮你看着数据和页面。 数据劫…...
Remainder Problem CF1207F
题目:题目链接 题目大意 题目描述 给你一个长度为 500000 的序列,初值为 0 ,你要完成 q 次操作,操作有如下两种: 1 x y : 将下标为 x 的位置的值加上 y2 x y : 询问所有下标模 x 的结果为 y 的位置的值之和 输入格…...
SpringBoot之自定义简单的注解和AOP
1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…...
2.2 添加注释
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 注释是为了方便理解代码含义而添加的简短的解释性说明。在编译时,编辑器不会将注释加入最终生成的文件中,不…...
自由学习记录(38)
python语法 def def print_receipt (store_name, items, total_price, cashier"Self-Checkout", payment_method"Credit Card"): Python 的 函数定义 语法 def print_receipt(...) → 定义了一个名为 print_receipt 的函数。store_name, items, total_…...
【SQL实验】触发器
下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】 触发器 1、为图书表设置更新触发器,根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录,然后更新书名、作者…...
C语言:二维数组在内存中是怎么存储的
目录 1. 二维数组的定义: 2. 行主序存储: 具体内存排列: 3. 如何通过指针访问数据: 4. 总结: 在 C 语言中,二维数组是按 行主序(row-major order) 存储的。也就是说,…...
CPU多级缓存机制
目录 一、前置知识 ---- CPU的核心 1.1. 单核与多核CPU 二、CPU多级缓存机制 三. 缓存的基本结构/缓存的存储结构 四、CPU缓存的运作流程/工作原理 五、CPU多级缓存机制的工作原理【简化版】 5.1. 缓存访问的过程 (5.1.1) L1缓存(一级缓存)访问 …...
Ansible剧本-playbook
Ansible剧本-playbook 1 playbook基础1.1 简介1.2 playbook的组成结构Task 任务列表任务报错,如何继续执行响应事件Handler 1.3 常用选项执行playbookplaybook查询帮助信息校验playbook语法测试playbook能否正常运行 2 变量 的定义方式2.1 定义规则2.2 vars 变量2.3…...
神经网络八股(3)
1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…...
SmartMediakit之音视频直播技术的极致体验与广泛应用
引言 在数字化时代,音视频直播技术已经深入到各个行业和领域,成为信息传递和交流的重要手段。视沃科技自2015年成立以来,一直致力于为传统行业提供极致体验的音视频直播技术解决方案,其旗下的大牛直播SDK凭借强大的功能和卓越的性…...
【R包】tidyplots----取代ggplot2的科研绘图利器
文章目录 介绍安装Usage文档参考 介绍 tidyplots----取代ggplot2的科研绘图利器。tidyplots的目标是简化为科学论文准备出版的情节的创建。它允许使用一致和直观的语法逐渐添加,删除和调整情节组件。 安装 You can install the released version of tidyplots fro…...
DeepSeek 15天指导手册——从入门到精通 PDF(附下载)
DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载: https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…...
C++知识点总结与复习
c中常见的关键字(面试题中经常出现) const 总结常见用法: const int a; //定义了常量整形的变量 a; 常量表示不可修改,定义的时候必须初始化。除此之外,和 int a;使用一样。 const int * p;//定义了指向常量整形变量的指针。…...
微信小程序实现拉卡拉支付
功能需求:拉卡拉支付(通过跳转拉卡拉平台进行支付),他人支付(通过链接进行平台跳转支付) 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…...
全面汇总windows进程通信(二)
在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: 信号量(Semaphore)和互斥量(…...
Unity 第三人称人物切动画时人物莫名旋转
前提: 使用Starter Asset包中的第三人称插件包. 在给3D角色的动画器增加新动画时, 发现进入新动画会让角色莫名转动. 观察后发现是动画强行将朝向掰"正", 人物动画在进行时朝向会一直变化, 这使得动作非常的怪异. 对系动画进行以下处理后, 将可以解决这种不自然: 选…...
启动Redis报错记录
突然启动Redis就报了个错:‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案,应该是6379端口已绑定,服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…...
vue2响应式数据原理
1. 核心原理 Vue 2 的响应式系统基于 Object.defineProperty,通过 依赖收集 和 派发更新 来实现数据的响应式 依赖收集:在读取数据时,记录哪些函数(或组件)依赖了该数据。派发更新:在修改数据时ÿ…...
OpenBMC:BmcWeb实例化App
BmcWeb是OpenBMC的一个核心模块,对外负责响应Redfish请求,并且由于OpenBMC的Web使用的Redfish api,所以BmcWeb也是Web的后台。 1.main函数 //src\webserver_main.cpp #include "webserver_run.hpp"int main(int /*argc*/, char** /*argv*/) noexcept(false) {re…...
二级公共基础之数据库设计基础(一) 数据库系统的基本概念
目录 前言 一、数据库、数据管理系统和数据库系统 1.数据 2.数据库 3.数据库管理系统 1.数据库管理系统的定义 2.数据库管理系统的功能 1.数据定义功能 2.数据操作功能 3.数据存取控制 4.数据完整性管理 5.数据备份和恢复 6.并发控制 4.数…...
自然语言处理NLP 04案例——苏宁易购优质评论与差评分析
上一篇文章,我们爬取了苏宁易购平台某产品的优质评价和差评,今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …...
图片爬取案例
修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…...
leetcode_动态规划/递归 70. 爬楼梯
70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 思路: 考虑: 假设现在已经爬到了某一阶台阶,那是如何到达这里的呢?可能是从前一阶台阶爬上来的&am…...
VoIP之音频3A技术
音频3A技术是改善语音通话质量的三种关键技术的简称,包括声学回声消除(Acoustic Echo Cancellation, AEC)、自动增益控制(Automatic Gain Control, AGC)、自噪声抑制(Automatic Noise Suppression, ANS&…...
SpringBoot 03 Web开发
SpringBoot 代替了SSM整合,避免了版本依赖冲突,不在需要手写配置文件 前言 springboot提供了starter场景启动器(web,Tomcat,jdbc),自带相关组件实现自动配置 场景启动器 一、自动配置 1.自动…...
官方文档学习TArray容器
一.TArray中的元素相等 1.重载一下 元素中的 运算符,有时需要重载排序。接下来,我们将id 作为判断结构体的标识。 定义结构体 USTRUCT() struct FXGEqualStructInfo {GENERATED_USTRUCT_BODY() public:FXGEqualStructInfo(){};FXGEqualStructInfo(in…...
Web刷题之PolarDN(中等)
1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当&…...
Https通信中证书验证流程
在 HTTPS 通信中,客户端验证服务器证书的有效性是确保通信安全的重要步骤。这一过程通常被称为 证书链验证 或 SSL/TLS 证书验证。以下是详细的流程和实现细节: 1. 证书验证的整体流程 客户端验证服务器证书的有效性主要包括以下几个步骤: …...
学习笔记-250222
论文: Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力,当提示输入目标类别时,llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…...
