react总结(二)

写这个总结的想法主要是来源于我的一个同事,他资历比较深,突然问我最近有没有在学习什么框架,我说在学react,他问我,为什么要学习react,然后我说了几点react的好处,其中一点是:react的虚拟DOM,不需要操作真实的DOM,从而减少性能消耗。然后他问了我一个很有意思的问题,当两个很复杂的DOM树,相互比较的时候,也很消费时间的,问我react是怎么去减少这个时间的消耗呢?然后我也很奇怪,我能想到的就是通过深度遍历或者广度遍历来获取每一个子节点,然后进行比较,但是这样操作的复杂度很高,性能消耗也很大。于是百度了一下,看到了DOM Diff这个算法,下面推荐一篇文章

https://www.w3ctech.com/topic/1598

详解 React diff

传统 diff 算法的复杂度为 O(n3),显然这是无法满足性能要求的。React 通过制定大胆的策略,将 O(n3) 复杂度的问题转换成 O(n) 复杂度的问题。

diff 策略

  1. Web UI 中 DOM 节点跨层级的移动操作特别少,可以忽略不计。
  2. 拥有相同类的两个组件将会生成相似的树形结构,拥有不同类的两个组件将会生成不同的树形结构。
  3. 对于同一层级的一组子节点,它们可以通过唯一 id 进行区分。

基于以上三个前提策略,React 分别对 tree diff、component diff 以及 element diff 进行算法优化,事实也证明这三个前提策略是合理且准确的,它保证了整体界面构建的性能。

  • tree diff
  • component diff
  • element diff

总结

  • React 通过制定大胆的 diff 策略,将 O(n3) 复杂度的问题转换成 O(n) 复杂度的问题;
  • React 通过分层求异的策略,对 tree diff 进行算法优化;
  • React 通过相同类生成相似树形结构,不同类生成不同树形结构的策略,对 component diff 进行算法优化;
  • React 通过设置唯一 key的策略,对 element diff 进行算法优化;
  • 建议,在开发组件时,保持稳定的 DOM 结构会有助于性能的提升;
  • 建议,在开发过程中,尽量减少类似将最后一个节点移动到列表首部的操作,当节点数量过大或更新操作过于频繁时,在一定程度上会影响 React 的渲染性能。
时间: 2024-11-10 01:27:35

react总结(二)的相关文章

React Native 二:快速入门

前面我们使用react-native init创建了一个项目,这是一个简单的Hello World App(项目结构如下图).对于iOS来说,你需要编辑index.ios.js来改变App:对于Android,你需要编辑index.android.js来修改App.然后摇晃菜单中点击Road JS查看改变.下面我们就以Android为例子来尝试修改了App. 一.修改index.android.js文件 index.android.js文件: //Mock数据 var MOCKED_MOVIES

react学习(二)试写一个例子

一.render方法 参考https://itbilu.com/javascript/react/EJiqU81te.html React的组件最终通过render方法渲染到DOM中,该方法由ReactDOM类库提供.API如下: ReactComponent render( ReactElement element,//需要渲染的元素 DOMElement container,//渲染结果在DOM中插入的位置 [function callback]//渲染完成后的回调函数 ) 二.动手写一个H

react生成二维码

图片实例: 简介: QRCode.js 是一个生成二维码的JS库.主要是通过获取 DOM 的节点,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 用法: 1. 在项目中引入qrcode.min.js文件. js文件网盘地址: https://pan.baidu.com/s/1kHB90FpMAJUvGvDNPpMm7Q 提取码: hkz4 2. 创建ref节点: <div style={{ width, height }} ref={qrcodeRef} /> 3. 在render

React(二)实现双向数据流

<div id="app"></div> <script src="bower_components/react/react.min.js"></script> <script src="bower_components/react/react-dom.min.js"></script> <!-- 引入React的一个扩展 --> <script src=&

从0开始学习react(二)

今天,开始学习第二节!!! 工欲善其事,必先利其器 react推荐我们使用webpack来打包文件,那么我们就用吧!(其实真心不想用啊) 至于好处网上写的天花乱坠的,大家自行解决啊... 这节主要就学习怎么配置webpack了,这玩意我捣鼓了整整一天才弄的一知半解,哎,脑子差就是吃亏... 1.提前准备工作 (ps:自己装好node啊,别怪我没提醒你) 首先,你需要有一个自己的文件夹,至于什么名字你自己看着办,我的叫做 reactdemo 里面放一个测试的html加一个js文件夹 2.安装 2.

React 随笔二

这周做的demo3和demo4.5 随记的小点. 1.js错误提示: Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `HelloMessage`. See https://fb.me/react-warning-keys for more information. 解决办法,给组件加个key属性,并赋值唯一key值用来标识.

听晴明老师从头讲React Native

01基本原理与开发环境搭建[录播]React Native架构和原理的简单介绍(16分钟)[录播]macOS iOS环境搭建(19分钟) [录播]macOS Android环境搭建(17分钟) [录播]Windows Android环境搭建(10分钟) [录播]Android设备的使用和注意事项(8分钟) 02javaScript.Node.ES6基础[录播]JavaScript基础(12分钟)[录播]ES6基础(12分钟)[录播]Node基础(15分钟)[资料]JavaScript.Node.

React中使用Ant Table组件

一.Ant Design of React http://ant.design/docs/react/introduce 二.建立webpack工程 webpack+react demo下载 项目的启动,参考 三.简单配置 1.工程下载下来之后,在src目录下新建目录“table”,新建app.js,内容如下. import React from 'react'; import ReactDOM from 'react-dom'; import ExampleTable from './Exam

React Native入门(一)环境搭建与Hello World

前言 目前关于React Native的教程很多,官方文档写的也不错,但是感觉大部分教程写的不是很清楚,导致我各种碰壁.因此我来写一个简洁的教程.本篇文章基于React Native 0.43,只适用于用Windows平台的Android开发者. 1.配置React Native 首先我们要先来安装一些软件,如下所示. Chocolatey Chocolatey是一个Windows上的命令行包管理器,安装了Chocolatey就可以通过命令行来安装一些我们需要软件.我们打开cmd命令行程序使用如

A Bite Of React(2) Component, Props and State

component component:用户自己定义的元素 const element = <Welcome name="Sara" />; class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } } 遇到自己定义的component Welcom,React会将它的属性(name)作为对象传递给组建Welcom,即{