react dom的diff理解及性能优化

diff的三大过程

当某个值变化时,他从根组件寻找
(key,state,props,context)
当父组件稳定时,react会跳过子组件的props的对比
只有当当前组件值改变时,从他开始,所有的子孙节点都会对比props
props是全等比较,所以,都会触发重新渲染(比如把组件A移动到父组件的某个兄弟节点位置,
那么我diff的过程中,如何寻找这个组件呢,就必须跨层级递归寻找
非常耗性能)所以,React假设,没有跨层级的移动组件
(因为实际开发中跨层级的移动组件确实极其的少)
所以diff就可以只比较同级的节点,性能从O n^3 变O n在 React 15 中是递归处理虚拟 DOM 的,
React 16 则是变成了可以中断的循环过程,Scheduler 调度器 —— 收集变化 调度任务的优先级,高优任务优先进入 ReconcilerReconciler 协调器 —— 负责找出变化的组件 diff算法  可中断Renderer 渲染器 —— 负责将变化的组件渲染到页面上Fiber 架构的核心即是"可中断"、"可恢复"、"优先级"
作为静态的数据结构来说,每个 Fiber 节点对应一个 React element,
保存了该组件的类型(函数组件/类组件/原生组件等等)、对应的 DOM 节点等信息。
作为动态的工作单元来说,每个 Fiber 节点保存了本次更新中该组件改变的状态、要执行的工作Fiber 把一个渲染任务分解为多个渲染任务,
而不是一次性完成,把每一个分割得很细的任务视作一个"执行单元"React 16 则是变成了可以中断的循环过程,每次循环都会调用shouldYield判断当前是否有剩余时间。
requestIdleCallback回调的执行的前提条件是当前浏览器处于空闲状态 去中断
然后	新一轮的调度开始

useMemo

https://juejin.cn/post/7253980320357269561?searchId=20231209154011153FF01F950F1F4D3A93#heading-2

 const childFucntion = useCallback(() => {action()}, [a, b])
作用:用于优化渲染性能。useMemo 会接收一个箭头函数包裹的回调函数和依赖项数组,然后返回回调函数的计算结果。
当依赖项数组中的某个值发生变化时,useMemo 会重新计算回调函数。如果依赖项没有发生变化,useMemo 会返回上一次计算的结果,
这样可以避免不必要的计算。如下,只有在a或者b发生改变的时候,value的值才会重新计算。

react 面试题整理

setstate是同步还是异步

setState自动批处理原生事件和setTimeout 中都是同步的合成事件和钩子函数中 是异步的

JSX

JSX JavaScriptXML的简写
HTMLJS结合的语法
JSX是react的语法糖,它允许在html中写JS,它不能被浏览器直接识别,
需要通过webpack、babel之类的编译工具转换为JS执行

函数组件与类组件的区别

函数组件以前被叫做无状态组件,就是因为函数组件内部不能保存state
类组件需要声明constructor,函数组件不需要
类组件需要手动绑定this,函数组件不需要
类组件有生命周期钩子,函数组件没有
类组件可以定义并维护自己的state,属于有状态组件,函数组件是无状态组件
类组件需要继承class,函数组件不需要
类组件使用的是面向对象的方法,封装:组件属性和方法都封装在组件内部 
继承:通过extends React.Component继承;
函数组件使用的是函数式编程思想

render的高级

render props
组件允许通过属性传入一个函数, 该函数返回一个 React 元素
组件内部通过调用该函数, 来渲染部分内容
组件内调用函数时允许为函数传递任意参数, 可以是组件内部状态、方法、或其他任意数据

HOC高阶组件

本质上就是一个函数, 是一个参数为组件, 返回值为新组件的函数强化 props: 类似 withRouter 为组件添加 props 属性,强化组件功能劫持控制渲染逻辑: 通过反向继承方式, 拦截原组件的生命周期、渲染、内部组件状态...
动态加载组件, 根据 props 属性, 动态渲染组件, 比如添加 logding、错误处理等待...
拦截组件渲染,包括是否渲染组件、懒加载组件
更好地复用组件逻辑,
代码复用
组件增强优化
Refs 不会被传递: 需要使用 React.forwardRef 进行处理

fiber

内部状态和外部参数,
key的变化16之前 树的深度优先遍历完成的,遍历是不能中断的
16之后循环来代替之前的递归.
一个循环就是一个时间切片,一个小任务
时间切片,在线程空闲的时候执行,
requestIdleCallback

虚拟DOM和diff算法

 当页面频繁操作时, 不去频繁操作真实 DOM虚拟 DOM可以跨平台:
一次性更新:### diff
React 在执行 render 过程中会产生新的虚拟 DOM
React 会对新旧虚拟 DOM 进行 diff 算法找到它们之间的差异,尽量复用 DOM 从而提高性能;所以 diff 算法主要就是用于查找新旧虚拟 DOM 之间的差异tree 层级(同层级比较)考虑到在实际 DOM 操作中需要跨层级操作的次数很少很少,只需要对树遍历一次就 OK ,component 层级:如果是同一个类型的组件, 则会继续往下 diff 运算, 如果不是一个类型组件, 那么将直接删除这个组件下的所有子节点,只做,插入,移动和删除element 层级: 是同一层级的节点的比较规则(tree比较通常是对整个DOM树或虚拟DOM树进行比较,
而element比较则是对同一层级的两个具体节点进行比较。)

受控组件和非受控组件

受状态控制的组件,必须要有onChange方法,否则不能使用 
受控组件可以赋予默认值(官方推荐使用 受控组件) 
实现双向数据绑定 form 数据被DOM本身控制,
可以用ref获取value,叫非受控组件。

合成事件


合成事件是事件委托的一种实现, 
主要是利用事件冒泡机制将所有事件在 document 进行统一处理,
会先执行原生事件,然后处理 React 事件
在底层磨平不同浏览器的差异
优点
减少事件注册, 减少内存消耗, 提升性能, 
只在 document 上注册一次即可
统一处理, 并提供合成事件对象, 抹平浏览器的兼容性差异
useCallback
 const childFucntion = useCallback(() => {action()}, [a, b])当依赖数组中的值发生变化时,useCallback 会返回一个新的函数实例。否则,它将返回上一次创建的函数实例
他俩是如何做性能优化的呢
当你去改变父组件中的state,就会导致父组件重新构建,
而父组件重新构建的时候,会重新构建父组件中的所有函数
(旧函数销毁,新函数创建,等于更新了函数地址),
新的函数地址传入到子组件中被props检测到栈地址更新。
也就引发了子组件的重新渲染。useCallBack并不能阻止函数重新创建
,它只能通过依赖决定返回新的函数还是旧的函数,
从而在依赖不变的情况下保证函数地址不变
useCallBack需要配合React.memo使用
useMemo会执行回调函数并且返回结果,
但是useCallback不会执行回调函数。他俩都需要 结合React.Memo进行使用

useEffect

useEffect(()=>{},[])setTimeout(()=>{dosomesing
},0)

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

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

相关文章

windows 创建SSH公钥

1、 运行电脑终端 powershell 2、检查你的电脑是否已经有 SSH key cd ~/.ssh ls 3、创建一个 SSH key ssh-keygen -t rsa -C “your_emailexample.com” or ssh-keygen -t ed25519 -C “your_emailexample.com” 代码参数含义: -t 指定密钥类型,默…

怎么把图片转文字?这几个图片转文字方法一定要知道!

怎么把图片转文字?无论是从书籍、网络还是社交媒体上,我们经常需要从图片中提取文字来进行复制、编辑或翻译。手动操作耗时耗力,效率低下,那么怎么把图片转文字呢?今天我将介绍三种不同的方法来实现图片转文字。 图片转…

OceanMind海睿思案例入选第二届中国数据治理年会“DCMM百项优秀案例”

近日,中国电子信息行业联合会在北京成功举办“第二届中国数据治理年会”。 本届大会以“数据强基、智领未来”为主题,汇聚我国数据治理领域的资深专家、学者、企业大咖同台论道,共话数据未来的发展与创新。 中新赛克海睿思作为DCMM3级乙方代…

HPM6750系列--总章

本栏目介绍先楫半导体出品的HPM6750芯片(基于HPM6750evkmini开发板) ​​​​​​​ 内容概述 HPM6750系列--第一篇 初识HPM6750 介绍HPM6750芯片信息,包括主频、内存、外设配置,并列举了各种开发工具和开发资源。 HPM6750系列--…

​urllib.parse 用于解析 URL​

源代码: Lib/urllib/parse.py 该模块定义了一个标准接口,用于将统一资源定位符(URL)字符串拆分为不同部分(协议、网络位置、路径等),或将各个部分组合回 URL 字符串,并将“相对 URL”转换为基于…

Cloudflare始终使用HTTPS且带参数跳转到www的域名

文章目录 设置教程设置图跳转实测 设置教程 关闭 SSL/TLS -> 边缘证书 的 Always Use HTTPS 规则 -> 页面规则 -> URL: http://www.example.com/* 设置成始终使用HTTPS 规则 -> 页面规则 -> URL: example.com/* 设置成 转发URL301重定向到 to https://www.ex…

气象监测与流程分析大屏,更有效地保护人们的生命和财产安全!

气象变化与我们的生活息息相关,随着时代的变迁和科技的飞速发展,气象监测正逐渐迈入数字化的时代。传统的气象观测方式已经无法满足日益增长的需求,数字化的气象监测成为了必然的选择。通过数字化技术的应用,气象数据的采集、传输…

简约大气视频制作模板PR剪辑素材PR项目工程文件

Premiere Pro模板,简约大气视频剪辑素材PR项目工程文件(包含手机竖屏分辨率),包含24个媒体占位符和9个文本占位符。可以编辑和自定义文本占位符和媒体占位符。用来展示照片视频制作。包含视频教程。 来自PR模板网:http…

2312d,d语言作为胶水,用C++调用rust

原理 源码: //主.cpp void foo(); int 主() {foo();中 0; }编译r.rs(被调用函数)文件: //r.rs编译命令. rustc --target i686-pc-windows-msvc r.rs --crate-type staticlib //r.rs文件内容,生成r.lib(11.2M)有点大. //用要staticlib.否则不行. //如果没有i686-pc-windows-m…

(c语言)计算一个数的每位之和(递归实现)

#include<stdio.h> int DigitSum(int x) {int sum 0, g0;if(x>0){g x % 10;sum g;return sumDigitSum(x/10);}return 0; } int main() {int x;printf("请输入需要计算的数\n");scanf("%d",&x);int yDigitSum(x);printf("%d",y);…

会议剪影 | 思腾携AI服务器亮相2023“机器人+”智能制造先进成果展

12月7日-9日&#xff0c;由山东省工业和信息化厅、济宁市人民政府、中国电子信息产业发展研究院主办的2023“机器人”智能制造暨数字经济发展先进成果展在济宁高新区展览馆举办。思腾合力作为行业领先的人工智能基础架构解决方案商出席本次盛会。 本届展会得到了来自政府、行业…

人工智能中的顺序学习:概念、应用和未来方向

一、介绍 人工智能 &#xff08;AI&#xff09; 中的顺序学习是一个关键研究领域&#xff0c;近年来引起了人们的极大兴趣。它指的是人工智能系统从数据序列中学习的能力&#xff0c;其中数据点的顺序至关重要。本文将探讨人工智能中顺序学习的概念、其重要性、应用、方法、挑战…

VSCode配置记录

1. 修改代码背景颜色 1&#xff09;Shift Command P&#xff0c;搜索框输入&#xff1a;settings.json 2&#xff09;输入配置 {"workbench.colorCustomizations": {"editor.lineHighlightBackground": "#86e9e93d", # 修改鼠标所在行背景色…

第P7周:咖啡豆识别(VGG-16复现)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、前期工作 import …

存爱至死不渝 | 双向奔赴的 BFS 算法 — 双向广搜

双向广搜 算法思想算法特点适用场景实现方式例题字串变换题目描述输入格式输出格式程序代码 算法思想 传统的 BFS 算法是从起始节点开始&#xff0c;逐层地访问图中的所有节点&#xff0c;直到到达目标节点。BFS 的时间复杂度为 O ( b d ) O(b^d) O(bd)&#xff0c;其中 b 是…

金和 OA C6/Control/GetSqlData.aspx/.ashx SQL 注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和 OA C6/Control/GetSqlData.aspx/.ashx接口处存在SQL注入漏洞,攻击者除了可以利…

cmake中的configure() 和option()命令的宏定义作用域问题

option() 命令&#xff1a; option(USE_MYMATH "Use provided math implementation" ON)用于在 CMakeLists.txt 中定义一个 CMake 变量 USE_MYMATH&#xff0c;并且默认值为ON。这个变量的值可以在 CMake 配置时通过 -D 选项来修改。例如&#xff1a;cmake -DUSE_MY…

探讨低代码——一种快速开发软件应用程序并且手动编码最少的方法

一、低代码、零代码、纯代码定义 低代码开发平台使企业在不编写大量代码的情况下快速创建复杂应用程序。与传统的纯代码开发相比&#xff0c;低代码开发能够大大减少开发周期&#xff0c;并降低技术门槛&#xff0c;使得开发过程更加高效。而零代码开发更进一步简化了开发过程&…

[多线程]一篇文章带你看懂Java中的synchronized关键字(线程安全)锁的深入理解

目录 1.前言 2.synchronized的特性 2.1synchronized前言 2.2乐观锁和悲观锁 2.3重量级锁和轻量级锁 重量级锁 &#xff1a; 轻量级锁&#xff1a; 2.4自旋锁和挂起等待锁 2.5 公平锁和非公平锁 公平锁&#xff1a; 非公平锁&#xff1a; 2.6可重入锁和不可重入锁 可…

Mac安装Adobe AE/pr/LR/ai/ps/au/dw/id 2024/2023报错问题解决(常见错误:已损坏/2700/146/130/127)

1.打开允许“允许任何来源” 如何打开允许任何来源&#xff1f;在 Finder 菜单栏选择 【前往】 – 【实用工具 】&#xff0c;找到【终端】程序&#xff0c;双击打开&#xff0c;在终端窗口中输入&#xff1a;sudo spctl --master-disable 输入代码后&#xff0c;按【return …