React教程第二节之虚拟DOM与Diffing算法理解

1、什么是虚拟DOM

虚拟DOMjavascript的一个对象,是内存中的一种数据结构,以树的形式存储UI的状态,树中的每个节点都代表着真实的DOM,用来描述我们希望在页面看到的 HTML结构;
现在的MVVM 框架,大多使用虚拟DOM进行数据视图的更新,相比较真实DOM的操作,
操作真实DOM时: DOM属性繁多处理增删改成比较繁琐,处理效率低,会出现重绘回流现象,导致页面更新缓缓卡顿;

原生的DOM也是 js的一个对象,只不过是浏览器提供的对象;
比如在JSX 中写法:


const dom = <h1></h1>
// 对应虚拟DOM:
const dom = {type: 'h1'}
const dom = document.createElement('h1')
-------
const dom = <div className="name">Andy</div>
// 对应的虚拟DOM为:
dom = {type: 'div', props:{ className: 'name', children:'Andy'}}

2、虚拟DOM的用途作用

虚拟DOM主要是为了提升操作更新界面的效率;目前前端流行的前端框架React Vue都是使用虚拟DOM进行更新;但是在一些对于性能要求极高画面绘制精细的应用中,虚拟DOM依然无法满足需求,需要使用更加低级的渲染技术,如:WebGL 或者直接操作DOM;

主要流程:

创建虚拟DOM树:将UI组件转化为虚拟DOM树,来表示UI结构;
A、Diffing算法:
每次更新属性状态时候,会新创建一个虚拟DOM树,并与之前的虚拟DOM树进行对比,找出差异;
B、最小范围更新:
通过 Diffing 算法,React 确定需要更新的 DOM 节点,并只对发生变化的部分进行更新;
C、渲染更新:
React 根据 Diffing 结果,对真实 DOM 进行最小化的更新操作。

3、React 通过Diff 算法如何进行 current processworkInProcess 对比的,以及16.8前后版本性能的对比

虚拟DOM的 Diffing 算法是 React优化性能核心,通过启发式算法来对比两颗虚拟的 DOM树,最大限度减少对比的计算量;

同层节点对比
React 只会比较同层的节点,不会跨层对比不同层次的节点。也就是说,如果元素的位置发生了变化,React 会先删除原来的节点,再插入新的节点。

唯一 key 标识:
在处理动态列表时,React 通过 key 属性来区分不同的节点。如果列表中的每个元素都有一个唯一的 key,React 就能高效地找到变化的元素,并只更新该部分。

React 15之前使用的是递归创建虚拟DOM,递归不能中断,如果层级很深,多导致递归线程占用时间长,阻塞主线程而导致出现卡顿现象
React 16之后为了处理这种不能中断的方式,将更新方案修改为异步的可中断方案,推出Fiber架构,将任务切片分隔异步渲染,根据不同的需求分配不同的优先级进行渲染,支持分批次批量更新;
vue2中使用的是双端对比,即:分别一个从头开始,一个从末尾开始,向中间对比靠拢,在递归的同时会对DOM进行操作;

而React认为实际应用中对于列表翻转,大量重绘重排场景比较少,而是采用双缓存的技术,在React的进程中,最多会同时存在两个Fiber树,当前屏幕看到渲染出来的视图树称为 current fiber树;正在缓存中进行状态属性处理的 树称为 workInProcess fiber树,当 workInProcess fiber 树渲染完成后,应用根节点的 current 指针会指向 workInProcess fiber 树,从而将 workInProcess fiber树更改为 current fiber 树完成一次视图更新渲染;

React 的更新会经历两个阶段render 阶段 和 commit 阶段。render 阶段是可中断的,commit 阶段是不可中断的。

render 阶段会生成 fiber 树,所谓的 diff 就会发生在这个阶段。React 通过深度优先遍历来生成 fiber 树,整个过程与递归是类似的,因此生成 fiber 树的过程又可以分为「递」阶段和「归」阶段

commit 阶段主要执行各种 DOM 操作、生命周期钩子、某些 hook 等

因此,diff 阶段不会直接变更 DOM,而是留到 commit 阶段再做变更

4、虚拟DOM 对比时候的 注意事项,key?

如果列表只是简单的展示,没有增删改查操作,可以使用index作为key值,相反则key值需要是唯一的,否则会使新旧DOM对比时候消耗更多的性能;
如图:key 唯一时候,key 使用index 时候图像对比

使用index 作为key 时候如下图:

index 作为key时

使用 唯一标识 作为key 时候

请添加图片描述

``

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

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

相关文章

多线程4:线程池、并发、并行、综合案例-抢红包游戏

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【WPF】Prism库学习(一)

Prism介绍 1. Prism框架概述&#xff1a; Prism是一个用于构建松耦合、可维护和可测试的XAML应用程序的框架。它支持WPF、.NET MAUI、Uno Platform和Xamarin Forms等多个平台。对于每个平台&#xff0c;Prism都有单独的发布版本&#xff0c;并且它们在不同的时间线上独立开发。…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

STM32 ADC --- 任意单通道采样

STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改&#xff1a;应用 使用cubeMX生成HAL工程 需求&#xff1a;有多个通道需要进行ADC采样&#xff0c;实现每次采样只采样一个通道&#xff0c;且可以随时采样不同通道的功能。 cubeMX配置 这里我们…

web——upload-labs——第十二关——%00截断

查看源码 分析源码我们可以知道&#xff0c;这里是基于白名单过滤&#xff0c;只允许上传jpg,png,gif&#xff0c;但是这里注意第八行&#xff0c;上传路径是可以控制的&#xff0c;所以可以利用%00截断&#xff0c;来达到上传木马的目的。这里要注意一下&#xff0c;%00截断想…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包&#xff1a; 像我的STM32F103C8T6的就下载这个&#xff1a; 依次打开&#xff1a; .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到&#xff1a; 这…

Spark:大数据处理的强大引擎

一、Spark 简介 Apache Spark 是一个专为大规模数据处理而设计的快速、通用、可扩展的大数据分析计算引擎。它诞生于 2009 年&#xff0c;由美国加州伯克利大学的 AMP 实验室开发&#xff0c;2013 年被纳入 Apache 开源项目&#xff0c;并迅速成为顶级项目。 Spark 被认为是 …

鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作

应用服务Map使用 地图定位 地点查询及导航 周边查询 点位标记定义等 地图定位 前提地图已经能正常显示&#xff0c;若不能显示请大家参考之前的那篇如何显示地图的博文 地图相关的api 位置效果图&#xff1a; module.json5配置权限 "requestPermissions": [{&…

编程语言02:语法基础

一、注释 (一)单行注释 java&#xff1a;//&#xff0c;快捷键 Ctrl/ package Summarize;public class L01_01 {public static void main(String[] args) {// 单行注释&#xff0c;快捷键Ctrl/} }python:#,快捷键Ctrl/ # python单行注释 (二)多行注释 java /*java多行注释…

ubuntu24.04网卡配置

vim /etc/netplan/01-netcfg.yaml /24表示子网掩码的长度。这种表示法称为CIDR&#xff08;无类别域间路由&#xff09;记法。CIDR记法将IP地址和它们的子网掩码合并为一个单一的值&#xff0c;其中斜杠/后面的数字表示子网掩码中连续的1的位数。 对于/24&#xff1a; 24表示…

基于普中51单片机开发板的电子门铃设计( proteus仿真+程序+设计报告+讲解视频)

基于普中51单片机开发板的电子门铃设计( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.15(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P17 1. 主要功能&#xff1a; 基于51单片机的电子门铃设计 1、…

HTML and CSS Support HTML 和 CSS 支持

GoTo DevExpress Data Grid 数据网格 HTML and CSS Support HTML 和 CSS 支持 HTML和CSS支持允许您创建完全自定义的UI元素&#xff0c;并消除使用基于属性的UI自定义和CustomDraw事件。您可以构建 HTML 格式的 UI&#xff0c;并使用 CSS 样式自定义 UI 元素的外观设置、大小、…

掌握Golang中的数据竞争检测:runtime/race包全面教程

掌握Golang中的数据竞争检测&#xff1a;runtime/race包全面教程 引言数据竞争问题概述数据竞争的定义数据竞争对程序的影响常见数据竞争场景 Golang runtime/race包概述runtime/race包简介启用数据竞争检测使用 go run使用 go build使用 go test 基本用法与示例单元测试中的使…

Ascend C算子性能优化实用技巧05——API使用优化

Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。使用Ascend C&#xff0c;开发者可以基于昇腾AI硬件&#xff0c;高效的实现自定义的创新算法。 目前已经有越来越多的开发者使用Ascend C&#xff0c;我们…

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得&#xff0c;实验需求为&#xff1a; 1.R5作为ISP&#xff1a;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c;出口公网地址需要通过PPP协议获取&#xff0c;并进行CHAP认证。&#xff08;PS&#xff1a;因PPP协议尚未学习&#…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …

Python-简单病毒程序合集(一)

前言&#xff1a;简单又有趣的Python恶搞代码&#xff0c;往往能给我们枯燥无味的生活带来一点乐趣&#xff0c;激发我们对编程的最原始的热爱。那么话不多说&#xff0c;我们直接开始今天的编程之路。 编程思路&#xff1a;本次我们将会用到os,paltform,threading,ctypes,sys,…

Web3浪潮下的区块链应用:从理论到实践的全面解析

随着Web3的兴起&#xff0c;区块链技术作为其核心支撑&#xff0c;正迎来前所未有的应用爆发。Web3不仅仅是技术的革新&#xff0c;更代表了一种去中心化、开放、透明的互联网愿景。在这一背景下&#xff0c;区块链技术的应用正从理论走向实践&#xff0c;推动着各行各业的数字…

网络安全:我们的安全防线

在数字化时代&#xff0c;网络安全已成为国家安全、经济发展和社会稳定的重要组成部分。网络安全不仅仅是技术问题&#xff0c;更是一个涉及政治、经济、文化、社会等多个层面的综合性问题。从宏观到微观&#xff0c;网络安全的重要性不言而喻。 宏观层面&#xff1a;国家安全与…

鸿蒙北向开发环境安装指南

境界一&#xff1a;昨夜西风凋碧树。独上高楼&#xff0c;望尽天涯路。----------王静安《人间词话》 单元一&#xff1a;鸿蒙开发工具的安装 学习目标 &#xff08;1&#xff09;完成鸿蒙开发工具Deveco Studio的安装。 任务1.1 下载DevEcoStudio 任务描述 DevEco Studi…