React diff的原理是什么

news2024/11/24 13:59:36

一、是什么

Vue一致,React通过引入Virtual DOM的概念,极大地避免无效的Dom操作,使我们的页面的构建效率提到了极大的提升

diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处

传统diff算法通过循环递归对节点进行依次对比,效率低下,算法复杂度达到 O(n^3),react将算法进行一个优化,复杂度降维为O(n)

二、原理

reactdiff算法主要遵循三个层级的策略:

  • tree层级
  • conponent 层级
  • element 层级

#tree层级

React 只会对相同层级的节点进行比较,如果节点跨层级移动,会直接删除旧节点,创建新节点。

image.png

只有删除、创建操作,没有移动操作,如下图:

image.png

react发现新树中,R节点下没有了A,那么直接删除A,在D节点下创建A以及下属节点,上述操作中,只有删除和创建操作

conponent层级

如果是同一个类的组件,则会继续往下diff运算,如果不是一个类的组件,那么直接删除这个组件下的所有子节点,创建新的

image.png

component D换成了component G 后,即使两者的结构非常类似,也会将D删除再重新创建G

element层级

对于同一层级的节点,React 会用唯一的 key 来标识,提供了三种操作:插入、移动和删除。React 会尽量复用 key 相同的节点,减少 DOM 操作。如下图:

image.png

通过key可以准确地发现新旧集合中的节点都是相同的节点,因此无需进行节点删除和创建,只需要将旧集合中节点的位置进行移动,更新为新集合中节点的位置

三、注意事项

对于简单列表渲染而言,不使用key比使用key的性能,例如:
将一个[1,2,3,4,5],渲染成如下的样子:

<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>

后续更改成[1,3,2,5,4],使用key与不使用key作用如下:

1.加key
<div key='1'>1</div>             <div key='1'>1</div>     
<div key='2'>2</div>             <div key='3'>3</div>  
<div key='3'>3</div>  ========>  <div key='2'>2</div>  
<div key='4'>4</div>             <div key='5'>5</div>  
<div key='5'>5</div>             <div key='4'>4</div>  
操作:节点2移动至下标为2的位置,节点4移动至下标为4的位置。

2.不加key
<div>1</div>             <div>1</div>     
<div>2</div>             <div>3</div>  
<div>3</div>  ========>  <div>2</div>  
<div>4</div>             <div>5</div>  
<div>5</div>             <div>4</div>  
操作:修改第1个到第5个节点的innerText

如果我们对这个集合进行增删的操作改成[1,3,2,5,6]

1.加key
<div key='1'>1</div>             <div key='1'>1</div>     
<div key='2'>2</div>             <div key='3'>3</div>  
<div key='3'>3</div>  ========>  <div key='2'>2</div>  
<div key='4'>4</div>             <div key='5'>5</div>  
<div key='5'>5</div>             <div key='6'>6</div>  
操作:节点2移动至下标为2的位置,新增节点6至下标为4的位置,删除节点4。

2.不加key
<div>1</div>             <div>1</div>     
<div>2</div>             <div>3</div>  
<div>3</div>  ========>  <div>2</div>  
<div>4</div>             <div>5</div>  
<div>5</div>             <div>6</div> 
操作:修改第1个到第5个节点的innerText

由于dom节点的移动操作开销是比较昂贵的,没有key的情况下要比有key的性能更好

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

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

相关文章

【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像+登录显示头像功能

表白墙退出登录操作-表白墙注册上传头像登录显示头像功能 文章目录 【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像登录显示头像功能1. Cookie与Session的删除1.1 表白墙页面增加登录出口1.2 点击链接退出登录1.3 测试 2. 上传文…

最新版的配音软件--- tts-vue 软件 下载安装成功过程

目录 本次软件是 Loker 制作&#xff0c;感谢作者的无私奉献。 软件视频效果 软件图片效果 1&#xff1a;电脑版的tts-vue 软件下载链接以及说明&#xff1a; 2&#xff1a;tts-vue 网站在线转换链接&#xff1a; 3&#xff1a;tts-vue 软件 功能简介 截至最新版本&#…

如何根据波特率计算设备每秒传输多少字符

前言 &#xff08;1&#xff09;微机原理要进行期末考试了&#xff0c;要准备“预习”了。今天看到关于波特率和字符传输的知识&#xff0c;感觉这个在实际项目中可能会使用到。 &#xff08;2&#xff09;因为之前我在学习韦东山老师的课程的时候&#xff0c;他通过波特率计算…

基于SpringBoot+Thymeleaf仓库管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着信息技术的快速发…

群晖IPv6/ddns-go/域名解析设置内网穿透方案

前言 群晖的内网穿透有很多方案&#xff0c;外网IPv4(这个现在很难搞到了)&#xff0c;中间服务器搭建Tunnel隧道&#xff0c;frp等方案(网速慢&#xff0c;流量限制&#xff0c;需另购服务器)&#xff0c;第三方服务花生壳等(按量付费&#xff0c;速度问题)。 本篇介绍的是 …

阿里云安装和远程连接mysql8.0数据库

目录 在云服务器安装MySQL8.0&#xff08;详细版&#xff09;&#xff1a; 安装过程中遇到的两个问题的解决方式 无法获取support-files/mysql.server 的文件状态(stat): 没有那个文件或目录 解决不能进行远程连接&#xff0c;报错Communications link failureThe last pac…

C++算法:排序之四(计数、基数、桶排序)

C算法&#xff1a;排序 排序之一&#xff08;插入、冒泡、快速排序&#xff09; 排序之二&#xff08;归并、希尔、选择排序&#xff09; 排序之三&#xff08;堆排序&#xff09; 排序之四&#xff08;计数、基数、桶排序&#xff09; 文章目录 C算法&#xff1a;排序三、非比…

本地gradle在idea中的配置

因为公司在用的gradle构建项目&#xff0c;由于学安卓时候把gradle搞的四不像&#xff0c;所以重新配置了gradle在此记录一下 文章目录 安装gradel官网下载解压init.d里面创建init.gradle文件父目录创建gradleRepository配置环境变量测试是否配置成功 idea配置gradle重新构建项…

深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机

深度学习笔记之Seq2seq——基于Seq2seq注意力机制的动机 引言回顾&#xff1a;基于机器翻译任务的 Seq2seq \text{Seq2seq} Seq2seq网络结构注意力机制的动机循环神经网络作为 Encoder \text{Encoder} Encoder产生 Context \text{Context} Context向量的缺陷注意力机制处理上述…

chatgpt赋能python:Python怎么从列表里随机抽取?

Python怎么从列表里随机抽取&#xff1f; 在编程中&#xff0c;我们常常需要从一个列表里面随机抽取一个元素来进行一些操作&#xff0c;比如说在一个游戏中随机抽取一个怪物来进行战斗。Python提供了一个内置模块——random模块&#xff0c;用于生成随机数。这个模块可以帮助…

(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】

❓1207. 独一无二的出现次数 难度&#xff1a;简单 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,…

做一个比较有意思的条目选择动画 css

做一个比较有意思的条目选择动画 css 效果 如何实现 原理就是将母元素设置成 relative 然后在四边放四个 absolute 的色块。 初始状态是opacity 为 0 的&#xff0c;当母元素 hover 的时候&#xff0c;将四个边角色块设置 opacity: 1 并偏移指定量。 html <div class&qu…

English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一

English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一 引言&#x1f349;句1: What do you read when you are travelling by train or bus?成分划分弱读爆破语调 &#x1f349;句2: What are other passengers reading?成分划分弱读连读语调 &#x1f349;句3: Perh…

软考A计划-系统架构师-官方考试指定教程-(15/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

规则引擎--QLExpress:普通表达式的运行

目录 QLExpress普通表达式执行解析并转化为ExpressNode语法解析,得到如下的语法树根据 ExpressNode 树生成指令树执行指令树得到结果InstructionConstData 的指令执行InstructionOperator的指令执行 最后得到结果 再看一个in表达式设置参数的执行 QLExpress github: https://g…

【matlab】matlab算法封装成工具包提供给程序调用

说明&#xff1a; 1、非进程通讯协议&#xff0c;无需在电脑上安装完整版的matlab开发环境。 2、本项目以C#为案例&#xff0c;调用的语言不限&#xff0c;操作流程基本相同。 一、准备工作 1、安装MATLABWebAppServerSetup集成开发环境 2、安装Visual stdio 2017集成开发环…

Openharmony添加编译自己应用

介绍一下Openharmony如何在庞大的编译构建系统中&#xff0c;增添自己想编译的内容。不定期更新~&#x1f438; gn官方文档&#xff1a; https://gn.googlesource.com/gn//main/docs/quick_start.md https://gn.googlesource.com/gn//master/docs/reference.md openharmony官…

Salesforce退出市场后类似的CRM系统有哪些

Salesforce退出中国市场后&#xff0c;对很多使用Salesforce的国内企业来说是一个不小的打击。他们需要寻找与Salesforce功能相当、具有良好口碑的CRM客户管理系统来替代。本文就为大家推荐五款类似Salesforce的CRM系统。 1、Zoho CRM Zoho CRM是一款SaaS云端CRM系统&#xf…

005: vue中el-upload 组件添加token的方法

第005个 查看专栏目录: 按照VUE知识点 ------ 按照element UI知识点 echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏…

谈谈嵌入式开发中签名校验和加解密作用的理解

1、前言 本博文不是讲解可信加签和固件加密的具体原理&#xff0c;而是谈谈实际嵌入式开发中&#xff0c;可信加签和固件加密的应用场景&#xff0c;可以帮助从事嵌入式开发的人员快速理解加签和加密的作用。 2、嵌入式开发中可信加签和固件加密介绍 (1)各家公司都有自己的可信…