React 虚拟dom

95 阅读2分钟

Virtual DOM

  • 改变页面内容(用户或系统完成的各种动作引起的响应数据模型中的变化)只能通过遍历查询 dom 树,修改 dom、样式行为、结构,来更新 ui

  • 消耗计算资源:每次查询 dom 几乎都需要遍历整颗 dom 树

  • 建立一个与 dom 树对应的虚拟 dom 对象(轻量级的 JavaScript 对象),以对象嵌套的方式来表示 dom 树及其层级结构

    • 将元素的属性和内容作为对象及其属性
  • 每次 dom 的更改就变成了对 js 对象的属性的增删改查

  • React 的渲染函数从 React 组件中创建一个节点树

为什么操作真实DOM的成本比较高?

  • dom 树的实现模块和 js 模块是分开的,跨模块的通讯增加了成本

  • dom 操作引起的浏览器的回流和重绘

  • pc 端是没有性能问题的,因为 pc端的计算能力强,而手机的性能参差不齐,会有性能问题

浏览器收到一个html页面是如何解析成页面呈现给用户的呢?

  • 边按顺序解析html 边构建 dom树

    • 浏览器有专门的html解析器来解析HTML,并在解析的过程中构建DOM树
  • 构建 renderTree:将样式css应用到dom节点上

  • 布局:递归计算呈现树节点的大小和位置

  • 绘制:将呈现树绘制出来显示在屏幕上

步骤

  • 底层数据改变 → 整个 UI 都将在 Virtual DOM 描述中重新渲染

  • 计算 DOM 之间的差异

  • 只用实际更改的内容更新 real DOM

区分Real DOM和Virtual DOM

Real DOM

文档对象模型,在页面渲染出的每一个结点都是一个真实DOM结构

  • 更新缓慢

  • 可以直接更新 HTML

  • 如果元素更新,则创建新 DOM

  • DOM操作代价很高

  • 消耗的内存较多

Virtual DOM

以 JavaScript 对象形式存在的对 DOM 的描述

  • 更新更快

  • 无法直接更新 HTML

  • 如果元素更新,则更新 JSX

  • DOM 操作非常简单

  • 很少的内存消耗