React介绍

React是Facebook开发的一款JS库,用于构建用户界面的类库。

它采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互。

特点:

  1. 声明式设计:React采用声明范式,你可以轻松描述你的应用

  2. 高效:React通过对DOM的模拟表现,最大限度地较少与DOM的交互。

  3. 灵活:React可以与你所知道的库或框架很好地工作。

在Web开发中,我们总需要将变化的数据实时反应到UI上,这时就需要对DOM进行操作。而复杂或频繁的DOM操作通常是性能瓶颈产生的原因

React为此引入了虚拟DOM(Virtual DOM)的机制:

在浏览器端用Javascript实现了一套DOM API。基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个虚拟DOM树,然后React将当前整个虚拟DOM树和上一次的虚拟DOM树进行对比,得到虚拟DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。

React Diff 算法

虚拟DOM作为React的一大核心技术,了解其实现原理对于灵活应用有着很大帮助。

Javascript 虚拟DOM对象

在我们项目中申明一个组件是这样的:


react.createElement('div', null, [// 创建一个imgreact.createElement('img', { src: "avatar.png", class: "profile" }),// 或者react.createElement('h1', null, [[user.firstName, user.lastName].join(' ')])
]);

最后,React都会转换成类似这样的基本对象:


{tagName: 'div',// 节点包含的属性properties: {style: {color: '#fff'}},// 子节点children: [],// 节点的唯一标识key: 1
}

Javascript DOM节点树

然后,React把Javascript DOM模对象 转换成 Javascript DOM节点树:


function create(vds, parent) {!Array.isArray(vds) && (vds = [vds]);// 如果没有父元素则创建个fragment来当父元素parent = parent || document.createDocumentFragment();var node;vds.forEach(function (vd) {// 如果是文字节点if (isText(vd)) {// 创建文字节点node = document.createTextNode(vd.text);} else {// 创建元素node = document.createElement(vd.tag);}// 将元素塞入父容器parent.appendChild(node);// 看看有没有子VNode,有孩子则处理孩子VNodevd.children && vd.children.length &&create(vd.children, node);// 看看有没有属性,有则处理属性vd.properties &&setProps({ style: {} }, vd.properties, node);});return parent;
}

Diff

现在我们得到的是Javascript 实现的虚拟DOM树,在一个事件循环中,当state或者preps变化时,React会创建一个新的虚拟DOM树,最后进行差异渲染。

diff(previous:VTree, current:VTree) -> PatchObject

React分三种情景:

1. 分层对比

React 仅仅是尝试把树按照层级分解. 这彻底简化了复杂度, 而且也不会失去很多, 因为 Web 应用很少有 component 移动到树的另一个层级去。它们大部分只是在相邻的子节点之间移动。

2. 基于key匹配

Keys是一个VNode的唯一识别,用于对两个不同的VTree中的VNode做匹配的。通过key锁定某个组件后,React就可以直接对比这两个差异DOM节点树,复杂度为O(n)。

所以这里有个性能优化的技巧。假设你有一个key组件,他的key属性为foo,后续又将它改为bar,那么React就会掉过DOM diff,同时完全弃置div所有自元素,从头渲染。在渲染大型子树以避免diff计算时,这样的设计很有用,因为我们知道这种计算就是在浪费时间。

3. 基于自定义元素做优化

React提供自定义元素,所以匹配很简单。React 只会匹配相同 class 的 component。

比如, 如果有个<Header><ExampleBlock>替换掉了,
React 会删除掉 header 再创建一个example block。我们不需要化宝贵的时间去匹配两个不大可能有相似之处的 component。

结束

React在你调用 component 的 setState 方法的时候, 将其标记为 dirty,到每一个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制。每次调用 setState 会重新计算整个子树.如果你想要提高性能, 尽量少调用 setState。

最后, 你还有可能去掉一些子树的重新渲染,如果你在 component 上实现function shouldComponentUpdate(nextProps, nextState) 的话,你根据 component 的前一个和下一个 props/state,告诉 React 这个 component 没有更新, 也不需要重新绘制。

原创文章,欢迎转载。转载请注明:转载自Fs21 ' s Home,谢谢!
原文链接地址:React Diff 算法

React Diff 算法相关推荐

  1. React Diff算法详解

    react diff算法 diff算法, 是 Virtual DOM 产生的一个概念, 用来计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面,从而提 ...

  2. 关于react diff 算法(译文)

    React是由facebook开发,用于构建用户界面的js类库,以提升性能为设计理念.在本文中,我将为大家介绍在React中的diff算法,以及它的渲染机制,以便于你能够更好的优化你的程序. Diff ...

  3. ReactiveNative学习之Diff算法

    React 源码剖析系列 - 不可思议的 react diff 深入浅出React(四):虚拟DOM Diff算法解析 React diff 算法 总结链接引用的文章 React出于性能的考虑,为了避 ...

  4. React 源码剖析系列 - 不可思议的 react diff

    目前,前端领域中 React 势头正盛,使用者众多却少有能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. React diff 作 ...

  5. diff 算法深入一下?

    一.前言 有同学问:能否详细说一下 diff 算法. 简单说:diff 算法是一种优化手段,将前后两个模块进行差异化比较,修补(更新)差异的过程叫做 patch,也叫打补丁. 文章主要解决的问题: 1 ...

  6. react循环key值_React源码揭秘(三):Diff算法详解

    编者按:本文作者奇舞团前端开发工程师苏畅. 代码参照React 16.13.1 什么是Diff 在前两篇文章中我们分别介绍了 React 的首屏渲染流程1和组件更新流程2,其中 首屏渲染会渲染一整棵 ...

  7. diff算法_详解 React 16 的 Diff 策略

    这是我 Deep In React 系列的第二篇文章,如果还没有读过的强烈建议你先读前一篇:详谈 React Fiber 架构(1). 前言 我相信在看这篇文章的读者一般都已经了解过 React 16 ...

  8. React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

    React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...

  9. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

最新文章

  1. PB 级数据处理挑战,Kubernetes如何助力基因分析?
  2. Jdbc连接数据库大全
  3. MikuMikuShaders
  4. JSP中文乱码问题解决方案
  5. comsol matlab 循环,comsol保存为m文件,怎样在m文件里面加入for循环 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  6. 1 第一次画PCB总结
  7. 判断小数是否相等_五年级上册数学综合练习题(填空、判断、选择、文字题),覆盖全册知识点!...
  8. 统计两个IP地址之间的IP个数
  9. 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架...
  10. MATLAB 图像处理基础(1)
  11. LeetCode 34 Search for a Range(搜索范围)
  12. Python 植物大战僵尸代码实现
  13. 【致远FAQ】A6+Cloud__V1.0_A6+cloud的M3端地址保存提示:not found
  14. [2021江西省赛高校组]wp
  15. 不会做动画的程序猿不是好的动画师(如何用css3动画做动画)
  16. 泸州职业技术学院计算机单招试题,2016泸州职业技术学院高职单招测试题(含答案解析)...
  17. 情报分析-diamond_threat_model
  18. 财务和计算机操作方面的专业知识,会计基础的学习方法
  19. 工厂如何提升生产环境管理水平?动环监控排第几
  20. 金融数据python分析实例_Python金融大数据分析-蒙特卡洛仿真

热门文章

  1. 一举打败16个同类模型,视频超分比赛冠军算法入选CVPR 2022,来自商汤南洋理工大学...
  2. 人脸识别走光引热议!原来后台能看到的不只有脸,网友已社死,审核辣哭眼...
  3. 中国首个AI考级来了:共分10级,北大出题,工信部认证 | 在线可测,我最多活3级...
  4. 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
  5. 【Elastic Stack学习】ELK日志分析平台(一)ELK简介、ElasticSearch集群
  6. MongoDB导入json数据
  7. 题解——洛谷 P2680 NOIP提高组 2015 运输计划
  8. 关于“数据可视化思考者”的8条军规
  9. POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)
  10. 百度地图API(二)