【Vue】实现的底层原理

底层原理

在 Vue 中实现数据对象和UI模板之间绑定关系,从而实现数据变化自动更新UI的核心机制,主要依赖于响应式系统。Vue的响应式系统基于JavaScript的对象属性访问器(getter和setter)和依赖收集的概念来实现。下面是这一机制的大致原理:

  1. 数据劫持(Data Hijacking)
    Vue通过使用Object.defineProperty函数对组件的数据对象进行处理,为数据对象的每个属性设置getter和setter。这一过程通常在Vue实例初始化时完成。

    • Getter用于依赖收集:当组件的模板或计算属性访问某个数据属性时,getter函数会被触发,此时Vue会记录当前组件为该属性的依赖。
    • Setter用于派发更新:当数据属性发生变化时(即赋值操作),setter函数会被触发,Vue将通知所有依赖于该属性的组件进行更新。
  2. 依赖收集(Dependency Collection)
    当组件在渲染过程中首次读取数据对象的属性时(通过getter),Vue会将当前组件(或更准确地说,当前组件的渲染函数)记为该属性的依赖。这意味着,如果该数据属性发生变化,Vue知道需要重新渲染哪些组件。

    • 每个组件实例都有一个对应的观察者实例(Watcher),负责将组件和数据属性关联起来。
    • 当数据属性被读取时,观察者实例会被添加到该属性的依赖列表中。
  3. 派发更新(Dispatching Updates)
    当数据属性发生变化时(通过setter),Vue会遍历该属性的依赖列表,通知每个依赖(即Watcher实例)更新自己。在组件层面,这通常意味着重新执行组件的渲染函数,生成新的虚拟DOM,并高效地将变化应用到真实DOM上。

  4. 虚拟DOM和高效更新

    • Vue使用 ** 虚拟 DOM(Virtual DOM)**来进一步提高性能。当数据变化引起组件重新渲染时,Vue首先生成新的虚拟DOM树,然后与旧的虚拟DOM树进行比较(diff算法),计算出需要在真实DOM上做的最小更改集。
    • 只有实际需要变更的DOM元素会被更新,这大大减少了直接操作DOM的开销,提高了应用的性能和响应速度。

通过这种响应式系统和虚拟DOM技术,Vue能够实现数据与UI之间的自动同步,使得开发者能够更专注于数据本身和业务逻辑,而无需手动操作DOM或手动同步数据与UI。

数据对象的属性及属性的依赖

在Vue的响应式系统中,数据对象的属性与其依赖之间的关系是通过依赖收集和派发更新机制建立的。这里的"依赖"通常指的是依赖于这个数据属性的Vue组件实例中的Watcher对象。每个组件实例都有一个或多个Watcher对象,这些Watcher对象负责将组件的渲染函数与组件所用到的数据属性连接起来。当数据属性变化时,这些Watcher对象会被通知,进而引起组件的重新渲染。

实例解释
假设有一个简单的Vue组件,它包含一个文本输入框,用于显示和更新用户的名字:

<template><div><p>Hello, {{ name }}!</p><input v-model="name" /></div>
</template><script>
export default {data() {return {name: '小白'};}
}
</script>

在这个组件中,name是组件的一个数据属性。

  1. 依赖收集:当这个组件首次渲染时,Vue会执行组件的渲染函数。在执行过程中,渲染函数会访问name属性(来显示用户名),这时会触发name属性的getter函数。Vue会识别出这个渲染函数(或者说对应的Watcher对象)依赖于name属性,并将这个Watcher对象加入到name属性的依赖列表中。
  2. 派发更新:当用户在文本框中输入新的名字时,v-model指令会更新name属性的值,这会触发name属性的setter函数。因为name属性的值发生了变化,Vue会遍历name属性的依赖列表,也就是通知所有依赖于name属性的Watcher对象。在这个例子中,就是通知这个组件的Watcher对象,告诉它name属性已经变化了。
  3. 组件重新渲染:Watcher对象接到变化通知后,会重新执行组件的渲染函数,这次渲染会使用新的name值。因此,界面上显示的名字也会更新为用户输入的新名字。

通过这种机制,Vue实现了数据属性与依赖之间的自动同步,确保了当数据变化时,依赖于这些数据的界面能够自动更新。这大大简化了开发过程,使开发者能够专注于数据逻辑,而不必手动操作DOM或编写额外的代码来处理数据和视图之间的同步。

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

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

相关文章

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传…

分享全栈开发医疗小程序 -带源码课件(课件无解压密码),自行速度保存

课程介绍 分享全栈开发医疗小程序 -带源码课件&#xff08;课件无解压密码&#xff09;&#xff0c;自行速度保存&#xff01;看到好多坛友都在求SpringBoot2.X Vue UniAPP&#xff0c;全栈开发医疗小程序 - 带源码课件&#xff0c;我看了一下&#xff0c;要么链接过期&…

GPT2从放弃到入门(四)

引言 体验地址&#xff1a;https://huggingface.co/spaces/greyfoss/gpt2-chatbot 上篇文章我们通过Gradio作为前端轻松地连接到训练好的Chatbot&#xff0c;本文介绍如何分享你创建好的模型给你的朋友。 当你训练好的模型推送到Huggingface Hub上后&#xff0c;其实还可以进一…

Linux 挂载磁盘

第一种方式&#xff08;不分区&#xff09; 磁盘不分区&#xff0c;直接挂载到某个目录。 查看磁盘列表 fdisk -l [root]# fdisk -lDisk /dev/vdb: 214.7 GB, 214748364800 bytes, 419430400 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): …

Codeforces Round 934 (Div. 2) ---- D. Non-Palindromic Substring --- 题解

目录 D. Non-Palindromic Substring &#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 下面给出两种代码的代码实现&#xff1a; 代码一&#xff1a;线段树实现hash判断回文字符串 代码二&#xff1a;manacher判断回文字符串 D. Non-Palindromic Substring &#…

大数据Hadoop生态圈体系视频课程

课程介绍 熟悉大数据概念&#xff0c;明确大数据职位都有哪些&#xff1b;熟悉Hadoop生态系统都有哪些组件&#xff1b;学习Hadoop生态环境架构&#xff0c;了解分布式集群优势&#xff1b;动手操作Hbase的例子&#xff0c;成功部署伪分布式集群&#xff1b;动手Hadoop安装和配…

codeforces div4 Double Strings

#include<iostream> #include<algorithm> #include<cstring> #include<map> using namespace std; int T, n; string s[900005]; map<string, int>mm;//存放每一个字符串是否出现过 int main() {cin >> T;while (T--){mm.clear();//每次清…

服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开发完成&#…

linux 离线安装 dotnet tool

1. 在官网下载对应的nuget包,比如: dotnet-dump NuGet Gallery | dotnet-dump 3.1.57502 注意文件名称: dotnet-dump.3.1.57502.nupkg 我犯了一个错误,下载比较慢,然后通过迅雷来下载,结果没有后缀名称. 2. 然后拷贝到linux上,比如: 拷贝到dp文件夹下, 在dp文件夹上级执行命…

2965: 寻宝猎人(贪心)

2965: 寻宝猎人 题目描述 寻宝猎人Tom发现了一处宝藏&#xff0c;宝藏为一个N * M 的矩阵组成&#xff0c;矩阵的每一个点都包含一个钱袋&#xff0c;钱袋中装有若干金币。现在Tom只想从这个矩阵中拿走一块 3 * 3 的矩阵&#xff0c;请问他能拿走的最大金币数量。 输入 第一行输…

mfc140.dll丢失的解决方法,快速修复win10系统dll问题

在Windows 10操作系统环境下&#xff0c;如果发现系统中关键的动态链接库文件mfc140.dll丢失&#xff0c;可能会引发一系列运行问题。mfc140.dll是Microsoft Foundation Class Library&#xff08;微软基础类库&#xff09;的重要组成部分&#xff0c;对于许多基于该库开发的应…

ACL访问控制协议

ACL 1. Access Control List 2. ACL是一种包过滤技术。 3. ACL基于IP包头的IP地址、四层TCP/UDP头部的端口号、[5层数据] 基于三层和四层过滤 4. ACL在路由器上配置&#xff0c;也可以在防火墙上配置&#xff08;一般称为策略&#xff09; 5. ACL主要分为2大类&…

代码随想录算法训练营第三十五天|860. 柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

860. 柠檬水找零 题目 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾…

【干货】无源滤波器设计讲解,工作原理+设计步骤

今天给大家分享的是&#xff1a;无源模拟滤波器针对很多入门小白不懂滤波器设计&#xff0c;一些老工程师上班很多年有的也不懂得总结知识点&#xff0c;以及想学习不知道怎么系统学习的这一类人群&#xff0c;前方知识点来袭&#xff0c;请君放心食用~ 在信号处理领域&#x…

java的一些内部小知识,类与对象的关系

目录 1. java2. 类与对象的关系 1. java test.java ---- javac --> Test.class ---- java-----> 内存 ----> cpu 源文件 二进制代码 所有正在运行的软件都在内存中有自己的内存空间 jvm —>运行java程序的&#xff0c;java虚拟机 main(); // 内部调用run()run(i…

苍穹外卖项目笔记

软件开发流程 需求分析&#xff1a;说明书和原型 设计&#xff1a;UI&#xff0c;数据库&#xff0c;接口设计 编码&#xff1a;项目代码&#xff0c;单元测试 测试&#xff1a;测试用例&#xff0c;测试报告 上线运维&#xff1a;软件环境安装&#xff0c;配置 软件环境…

迷宫与陷阱(蓝桥杯)

文章目录 迷宫与陷阱问题描述bfs解题思路代码 迷宫与陷阱 问题描述 小明在玩一款迷宫游戏&#xff0c;在游戏中他要控制自己的角色离开一间由 N x N 个格子组成的2D迷宫。 小明的起始位置在左上角&#xff0c;他需要到达右下角的格子才能离开迷宫&#xff0c;每一步&#xf…

Mybatis中条件传入多个参数时,如何处理

entity&#xff1a; Data AllArgsConstructor NoArgsConstructor public class User {private Integer id;private String username;private String password;private String phone;private String address; }dao接口&#xff1a; public interface UserDAO {List<User>…

C++ 如何去认识模板

引言: C模板是泛型编程的基石,允许程序员定义可与任何数据类型协作的函数和类。这种机制极大地增加了代码的灵活性和复用性,是C最强大的特性之一。本文将深入探讨C模板的概念、优势以及使用方法,帮助读者掌握这一重要的编程工具。 文章目录 模板简介模板的优势一、模板基础1.1…

基于vue+element+springboot+uniapp开发的智慧城管源码,java智慧城市管理综合执法系统源码

智慧城管源码&#xff0c;智慧执法&#xff0c;数字化城市管理综合执法系统源码 智慧城管系统充分利用物联网、云计算、信息融合、网络通讯、数据分析与挖掘等技术&#xff0c;对城市管理进行全方位覆盖。它通过建立城市综合管理平台&#xff0c;将城市的信息和管理资源有机结合…