Vue-diff算法和双向数据绑定原理

news2024/11/25 13:36:01

Vue–diff算法

我们提到了vue–diff算法之前先说一下关于vue的编译过程

一、Vue的编译过程主要分为以下的几个步骤:

1,解析模板:Vue会将模板解析语法树AST,并且对其中的指令和元素进行标记。

2,优化静态内容:Vue对模板中的静态内容进行优化,减少更新时的性能消耗。

3,生成渲染函数:Vue会根据AST生成渲染函数,即将把模板转换成可执行的JavaScript代码。渲染函数的生成有两种方式,一种是通过模板编译成render函数,另一种是通过模板编译成虚拟DOM

4,执行渲染函数:生成的渲染函数,我们需要执行,这里的执行就是把虚拟的DOM转换成真实的DOM节点,并将其渲染到页面上

二、Vue的diff算法的使用

定义:Vue的diff算法主要是用来比较虚拟DOM差异的一种算法,通过比较前后的两个虚拟DOM的差异,然后根据差异进行最小化的更新,从而避免重新渲染整个页面,提高页面的性能

Vue的diff算法主要分为三个步骤:

1,创建新的旧虚拟节点的差异

在新旧虚拟节点的对比过程中,为了提高对比效率,需要为新旧虚拟节点创建映射表,将旧节点对应的关系记录下来,方便后续比对过程中的查找和匹配。

2,比较新旧寻节点的差异

在比对过程中,Vue采用深度优先遍历的方式,一级一级地比较新旧虚拟节点的差异。如果新旧虚拟节点相同,则不需要进行更新;如果不同,则需要根据差异类型进行相应的更新操作。

3,页面视图的更新

在比对完成后,根据差异类型进行相应的更新操作,更新DOM节点,最终渲染出新的页面视图。

Vue双向数据绑定原理

Vue的双向数据绑定主要是通过数据劫持(Object.defineProperty())实现的。具体实现流程如下:

Vue实例化时,会对数据进行observe(观察),即使用Object.defineProperty()对每个属性进行劫持。

当数据变化时,会触发setter方法,在setter方法中,会通知所有与该数据相关的视图进行更新。

对于模板中的指令(如v-model),会通过directive进行处理,即对指令进行解析,得到绑定的数据对象和对应的key。

在directive中,会给该数据对象的key属性添加一个Watcher实例,用于侦测该数据的变化,并更新视图。

当数据变化时,该数据的setter方法会被触发,setter方法中会通知所有依赖该数据的Watcher实例更新视图。

具体来说,Vue的数据绑定分为三个部分:

1. Observer:数据监听器,能够对数据对象的每个属性进行监听,当数据发生变化时,能够触发相应的回调函数。

2. Watcher:观察者,将数据对象的属性与模板指令进行绑定,当数据发生变化时,能够触发相应的更新操作。

3. Compiler:编译器,将模板指令转换为对应的DOM操作,并将Watcher与Observer进行关联,实现数据的双向绑定。

在这三个部分中,Observer是最核心的部分,其原理是通过递归遍历数据对象的每个属性,并为其添加getter/setter,当属性被读取或者修改时,能够触发相应的回调函数,从而实现数据的监听和更新。

需要注意的是,由于Observer需要递归遍历整个数据对象,因此在大规模数据绑定的情况下,可能会带来一定的性能问题。为了解决这个问题,Vue提供了虚拟DOM和异步更新等技术,从而优化了数据绑定的效率。

在这里插入图片描述
任务拆分:

将vue实例中的数据渲染到页面上
将页面上的数据变更同步到vue实例中
vue实例中data数据变更 页面上数据同步变更

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

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

相关文章

VUE的基本使用——hello,vue

一、准备一个容器root 二、创建一个Vue实例 三、配置容器 四、配置数据 五、将数据渲染到容器中 总结 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthde…

【挑战开发100个项目 | 1. C语言学生管理系统】

本项目是一个简易的学生信息管理系统&#xff0c;用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储&#xff0c;实现了数据持久化。项目采用模块化设计&#xff0c;具有较好的可读性和扩展性。 一&#xff0c;开发环…

服装租赁小程序商城的作用是什么

如毕业礼服、演出服、场景拍照服、拍戏拍段子等很多人并不会直接全价购买&#xff0c;由于穿着次数少&#xff0c;所以服装租赁在市场中的需求也不少。 但传统线下服装租赁商家也很难拓展到客户&#xff0c;而需求者也无法快速触达到商家&#xff0c;线上经营没有自己的平台&a…

自学WEB后端03-Node.js 语法

学习后端路线&#xff1a; JavaScript 基础语法 Node,js 内置 API 模块 (fs、 path、 http等) 第三方 API 模块 (express、mysql等) 今天主要回顾下Node.js 语法 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它提供了一种能够在服务器端运行 JavaScr…

如何使用php提取文章中的关键词?PHP使用Analysis中英文分词提取关键词

1、下载Analysis&#xff0c;创建test.php测试 2、引入Analysis实现中文分词 <?php include "./Analysis/Analysis.php";$annew \WordAnalysis\Analysis(); $content"机器学习是一门重要的技术&#xff0c;可以用于数据分析和模式识别。"; //10分词数…

Python3操作MySQL8.XX创建表|CRUD基本操作

Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 一&#xff1a; Python3操作Mysql数据库建表 import pymysqlPython3操作Mysql创建表&#xff1a; # 打开数据库连接 db pymysql.connect(host"localhost", user"您…

R语言绘制环状柱状堆积图+分组+显著性

无叠加、显著性的代码&#xff1a; #设置工作环境 rm(listls()) setwd("D:/Desktop/0000/code-main/条形图")#加载R包 library(ggplot2) # Create Elegant Data Visualisations Using the Grammar of Graphics library(tidyverse) # Easily Install and Load the Ti…

联邦学习应用研究现状及发展趋势

本文章主要参考第32届国际人工智能联合会议&#xff08;IJCAI&#xff09;上由清华大学人工智能研究院知识工程研究中心&#xff08;KEG&#xff09;、北京智谱华章科技有限公司、开放群岛开源社区联合编写的《2023联邦学习全球研究与应用趋势报告》&#xff0c;对重点内容进行…

机器学习算法基础--K-means应用实战--图像分割

目录 1.项目内容介绍 2.项目关键代码 3.项目效果展示 1.项目内容介绍 本项目是将一张图片进行k-means分类&#xff0c;根据色彩k进行分类&#xff0c;最后比较和原图的效果。 题目还是比较简单的&#xff0c;我们只要通过k-means聚类&#xff0c;一类就是一种色彩得出聚类之…

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐

挺多的&#xff0c;比较普遍的是QMT和Ptrade&#xff0c;python语言&#xff0c;易上手&#xff0c;通用性好&#xff0c;要说适用性可以考虑Ptrade&#xff0c;问一下你的客户经理有没有&#xff0c;用Ptrade的券商也多&#xff0c;如果之前用一创聚宽你可以无缝切换&#xff…

网络安全内网渗透之DNS隧道实验--dnscat2直连模式

目录 一、DNS隧道攻击原理 二、DNS隧道工具 &#xff08;一&#xff09;安装dnscat2服务端 &#xff08;二&#xff09;启动服务器端 &#xff08;三&#xff09;在目标机器上安装客户端 &#xff08;四&#xff09;反弹shell 一、DNS隧道攻击原理 在进行DNS查询时&#x…

python中使用matplotlib绘图

一、背景 当我们在写python程序时&#xff0c;不可避免的需要将数据可视化&#xff0c;也就是绘制出数据的曲线图&#xff0c;以便我们更直观的观察数据间的变化&#xff0c;以及方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是&#xff1a; 翻译过来也就…

SQLAlchemy关联表删除策略设置

目录 SQLAlchemy关联表 常用的级联选项 外键 SQLAlchemy关联表 SQLAlchemy 是一个 Python 的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许你在 Python 中使用类来表示数据库中的表&#xff0c;从而更方便地进行数据库操作。在 SQLAlchemy 中&#xff0c;可…

ElementUI - 主页面--动态树右侧内容管理

一.左侧动态树 1.定义组件 ①样式&数据处理 <template><el-menu class"el-menu-vertical-demo" background-color"#334157"text-color"#fff" active-text-color"#ffd04b" :collapse"collapsed" router :def…

手撸RPC【gw-rpc】

文章目录 基于 Netty 的简易版 RPC需求分析简易RPC框架的整体实现协议模块 &#x1f4d6;自定义协议 &#x1f195;序列化方式 &#x1f522; 服务工厂 &#x1f3ed;服务调用方 ❓前置知识——动态代理&#x1f573;️Proxy类InvocationHandler 接口 RPC服务代理类内嵌Netty客…

轻松学会 Git(三):掌握 Git 的远程操作

文章目录 前言一、分布式版本控制系统的理解1.1 什么是分布式版本控制系统&#xff1f;1.2 工作原理1.3 分布式版本控制系统的优势 二、初识 Git 远程仓库2.1 远程仓库的概念2.2 Git 远程操作2.3 远程仓库托管服务 三、新建远程仓库四、克隆远程仓库到本地4.1 使用 HTTPS 方式克…

记录一下 malloc 是如何分配内存的

系统深入学习笔记-malloc 以 32 位系统为例&#xff0c;&#xff0c;通过这张图你可以看到&#xff0c;用户空间内存从低到高分别是 6 种不同的内存段&#xff1a; 代码段&#xff0c;包括二进制可执行代码&#xff1b;数据段&#xff0c;包括已初始化的静态常量和全局变量B…

MySQL ——多条件查询(like)

一、基本语法 MySQL LIKE多条件查询语句的基本语法如下&#xff1a; SELECT * FROM table WHERE column1 LIKE %value1% AND column2 LIKE %value2%; 二、说明 在上面的多条件查询语句中&#xff0c;%是通配符&#xff0c;表示任意字符。如果您在LIKE语句中使用%字符&#x…

刚学习编写代码时的愚蠢瞬间:初学者的代码经验分享

刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享 刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享摘要引言糟糕的变量命名&#x1f937;‍♂️ 问题&#x1f605; 解决方案 异常处理的忽略&#x1f648; 问题&#x1f60e; 解决方案 魔法数值的滥用&…

沈阳市浑南区、沈阳国际软件园领导一行莅临中睿天下总部考察指导

近日&#xff0c;沈阳市浑南区委常委、常务副区长傅涵&#xff0c;沈阳国际软件园总经理张永鹏一行会见了中睿天下高级合伙人兼市场负责人周学龙。沈阳高新区管委会经发局局长王博&#xff0c;沈阳高新区管委会投资促进局姜振杰&#xff0c;沈阳国际软件园驻京办主任王军超&…