React其它相关知识点

一,解释一下React Fiber?

简单来说,核心就是在虚拟dom和浏览器的调用栈之间多了一个虚拟调用栈,和虚拟dom一样,这个虚拟调用栈也是在内存中的,这个虚拟调用栈就类似于一个任务调度器,它可以暂停一个任务,也可以重启一个任务,也可以终止一个任务,还能给任务分配优先级,这样栈的执行顺序就能定制了。React Fiber利用分片的方式,将渲染分割成了多个事务,然后根据每个事务的执行优先级来进行渲染,从而提升渲染计算性能。

二,React性能分析?

1,可以借助 Chrome Devtools 的 Performance 面板

通过观察 Frames(帧)那一栏,会显示对应的fps,如果低于60的,就会有卡顿感,找到了卡顿的点,再去查看Main 那一栏展开,这一栏主要是会列出JS的调用栈,然后就能看到对应的执行时间,找到执行较慢的函数,从而定位到问题。

2,可以利用React devtools

React 16.5版本引入了Profiler功能,通过Record来分析一段组件更新的数据,主要是监测的React组件commit阶段,借助rank视图或者火焰图来观察组件状态更新时的渲染时间以及是否存在渲染浪费。

(React 16以后,组件渲染分为render阶段和commit阶段,render阶段决定了需要进行哪些变更,比如DOM,这个阶段会调用render函数;而commit阶段主要就是执行一些diff出来的变更请求,比如DOM的插入、更新、删除等,还会调用didmount、didupdate等生命周期函数)

三,React错误捕获?

React提出了一个错误边界的概念,就是在组件最外层包一个捕获错误的组件,只要组件里定义了static getDerivedStateFromError或者componentDidCatch方法,两个中的一个,当子组件有错误抛出时,就会进行捕获。

四,为什么操作DOM很耗性能?

不一定。

以Chrome为例,DOM对象是使用C++开发的,而通过V8 binding,在V8引擎内会有一个和DOM对象对应的JS对象,我们称之为Wrapper objects(包装对象),操作DOM其实就跟操作JS对象一样。

如果只是修改document的一个属性,其实速度和修改对象的一个属性一样,但是如果是修改像document.title,那就不一样了,这等于是修改了原生DOM对象的属性了,所以这时候的性能损耗,其实就是用在JS对象和DOM对象的转换和同步上面。

还有就是重排和重绘,

五,聊一聊diff算法

传统的diff策略是循环递归所有的节点,进行依次对比,复杂度是O (n ^ 3)

react diff策略三点:

1,tree diff

Web UI中DOM节点跨层级的移动操作特别少,因此两棵树只会比较同一层级的节点

2,component diff

拥有相同类的两个组件会产生相似的树形结构,如果类不同,则默认不同

3,element diff

对于同一层级的一组子节点,可以通过唯一id进行区分,也就是设置唯一key进行优化

React其它相关知识点的更多相关文章

  1. React及Nextjs相关知识点小结

    React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...

  2. React Test相关资料

    karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...

  3. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  4. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  5. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  6. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  7. 学习记录013-NFS相关知识点

    一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...

  8. TCP/IP 相关知识点与面试题集

    第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...

  9. Python开发一个csv比较功能相关知识点汇总及demo

    Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...

随机推荐

  1. Angular 10材质的模态弹出示例和教程

    在本教程中,我们将通过示例使用Angular 10材质构建模式弹出窗口. 在这里,我们将研究创建Angular 10项目,安装和设置Angular 10材质,以及创建自定义材质模块文件. 在本教程中, ...

  2. python8.3多进程

    from multiprocessing import Processimport time def run1 (name,sex): print(name,sex,"执行进程1" ...

  3. Python高性能HTTP客户端库requests的使用

    Python中有许多HTTP客户端.使用最广泛且最容易的是requests. 持续连接 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...

  4. Springboot日志LOGO改变和设计

    每次启动Springboot的时候,SpringBoot都会打印一个LOGO,那么这个LOGO是可以关闭和改变的. 1.关闭Springboot的LOGO 2.改变Springboot的日志LOGO ...

  5. [BZOJ4237]稻草人 题解

    我们考虑分治一下 按\(x\)坐标排序 然后对于每一段的两部分都按\(y\)排序 左右两边都维护一个单调栈 然后考虑右边对左边的贡献就行了 #include <bits/stdc++.h> ...

  6. C#LeetCode刷题-栈

    栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水   35.6% 困难 71 简 ...

  7. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  8. neo4j批量导入数据的两种解决方案

    neo4j批量导入数据有两种方法,第一种是使用cypher语法中的LOAD CSV,第二种是使用neo4j自带的工具neo4j-admin import. LOAD CSV 导入的文件必须是csv文件 ...

  9. 虚拟化技术之kvm磁盘管理工具qemu-img

    在前边的博客中,我们大致了解了virsh这个工具对kvm虚拟机的一些操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/virsh/:今天我们来了解下kvm ...

  10. .Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统

    项目名称:学生信息管理系统1.0 后台框架:.Net Core 3.1 + EF Core    yrjw.ORM.Chimp 前端框架:ASP.NET Core MVC  +  LayUI + Bo ...