React基本知识

143 阅读5分钟

React相比其他框架的优点:

  1. 组件的组合模式
  2. 高效的性能
  3. 单向响应数据流
  4. 分离的框架设计

组件的组合模式

  • 在dom树上的节点被称为元素。在这里则不同,Virtaul DOM上称为component,Virtaul DOM的节点就是一个完整抽象的组件,它是由components组成。
  • 组合模式:组合模式有时候又叫做部分-整体模式,它使我们树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
  • React就是基于组合模式,无论是应用等级还是一个表单亦或是一个按钮都视为一个组件,然后基于组件的组合构建整个应用,这样的结构一直是前端想要却迟迟不来的web component。

React里写的所有东西都是一个组件,最小的组件就是一个元素

基于组合模式的优点:

  • 构建可重用组件:组建的开发能够形成公司的组件库,每个业务的开发都能积累可重用的组件。
  • 无学习障碍:天然符合html的结构,对前端开发者来说,几乎没有学习障碍。
  • 具有弹性的架构:组合模式很简单却很有效,能够构建简单的页面也能构建大型的前端应用。
  • 源码可维护性高:开发只是工作中的一部分,应用的上线才是噩梦的开始,很多大型应用因为复制业务逻辑无法快速响应业务需求,可维护性低。

单向数据流

组件之间数据传递是单向的,只能由父组件向子组件传递数据。 我们都知道JavaScript是脚本语言,不像静态语言一样通过编译定位问题,想要清晰的定位到应用中的bug需要深入了解业务代码,对于大型前端应用来说,因为业务代码量很大且复杂,很难定位到bug。然后React的单项数据流的设计让前端bug定位变得简单,页面的UI和数据的对应是唯一的,我们可以通过定位数据变化就可以定位从而展现问题。

高效的性能(这一段要背下来)

React实现的原理:Virtual DOM(虚拟DOM)

传统的web应用,操作DOM一般都是直接更新操作,但是我们知道DOM更新通常是比较昂贵的。而React为了减少对DOM的操作,提供了一种不同的而又强大的方式来更新DOM,代替直接的DOM操作。就是Virtual DOM,一个轻量级的虚拟的DOM,就是React抽象出来的一个对象,描述DOM应该是什么样子,应该如何呈现。通过这个Virtual DOM去更新真实的DOM,由这个VDOM管理真实DOM的更新。

分离的框架设计

  • React.js现在的的版本已经将源码分开为ReactDOM和React.js,这就意味着React不仅仅能够再web端工作,甚至可以在服务器(node.js),Native端运行。
  • 与此同时,我们可以自定义自己的渲染器,实现比如Three.js,Pixi.js,D3.js的React方式渲染。

什么是虚拟DOM?

就是React里的一个对象,虚拟对象可以被渲染为真实DOM,它是一个轻量级的dom,占据内存空间小。

diff算法:(背下来)

diff算法如何实现高效?

  • 主要解决渲染真实DOM的效率低问题。
  • diff算法的作用:计算出VDOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面。

传统diff算法:

通过循环递归对节点进行依次对比,算法复杂度达到O(n^3),n是树的节点数,这个有多可怕呢?——如果要展示1000个节点,得执行上一次比较。即便是CPU快能执行30亿条命令,也很难在一秒内计算出差异。

React的diff算法

将VDOM树转化成成actual DOM树的最少操作的过程称为调和。diff算法是调和的具体实现。

diff算法策略(背下来)

React用三大策略,将O(n^3)复杂度转化为O(n)复杂。

  1. 策略一(tree diff):
  • Web UI中的DOM节点跨层级的移动操作特别少,可以忽略不计(基本都是同级之间操作)
  1. 策略二(component diff)
  • 拥有相同类的两个组件,生成相似的树形结构
  • 拥有不同类的两个组件,生成不同的树形结构
  1. 策略三(element diff)
  • 对于同一级的一组子节点,通过唯一key区分。

diff算法的三大策略总结:先找一整层(大范围)哪个地方一样,找到以后看哪个组件不一样,找到具体哪一个组件不一样。就再看这个组件里的哪个标记不一样。

tree diff

  1. React通过updateDepth对Virtual DOM进行层级控制
  2. 对树分层比较,两棵树只对同一层次节点进行比较。如果该节点不存在时,则该节点及其子结点会被完全删除,不会再进一步比较。
  3. 只需遍历一次,就能完成整棵DOM树的比较。 注意:diff之间但考虑同层级的节点位置变换,如果是跨层级的话,只有创建节点和删除节点的擦欧总。因此官方建议不要进行DOM节点跨层级操作,可以通过CSS隐藏、显示节点,而不是真正的移除,添加DOM节点。

微信图片_20220905144026.jpg

微信图片_20220905144031.jpg

React的应用范围

web端应用 原生应用——IOS、Android、Native应用 Node.js服务端渲染html

多页面应用开发

微信图片_20220905212031.jpg