• 认识react虚拟Dom


    前端技术的快速发展,让现在的vue、react成为主流框架

    一开始的静态页面,到后来的jquery,到现在的vue、react,mvvm、mvc前端开发模式都使用了虚拟dom
    但纵观主流框架好像也是对虚拟dom 的各种造作和改进
    为什么要使用虚拟dom呢?

    首先我们了解下什么是虚拟dom

    1. 虚拟 DOM 是 JS 对象
    2. 虚拟 DOM 是对真实 DOM 的描述
    <h1 className="greeting">Hello, world! </h1>
    

    这个标签在react会展示为如下类型:

    const element = {
      type: 'h1',
      props: {
        className: 'greeting',
        children: 'Hello, world!'
      }
    };
    

    React 中的虚拟 DOM 大致是如何工作的。虚拟 DOM 在 React 组件的挂载阶段和更新阶段工作流程如下:

    • 挂载阶段,React 将结合 JSX 的描述,构建出虚拟 DOM 树,然后通过 ReactDOM.render 将dom树转换为真实的dom,挂载到页面上;

    • 更新阶段,页面在作用于真实 DOM 之前,会先作用于虚拟 DOM,虚拟 DOM 将在 JS 层借助diff算法先对比出具体有哪些真实 DOM 需要被改变,然后再将这些改变作用于真实 DOM,进行更新渲染。

    虚拟DOM保留了真实DOM节点的一些基本属性,和节点之间的层次关系,把它们放在一个对象中,它相当于在javascript和DOM之间的一层“缓存”

    虚拟DOM是如何解决问题的
    屏幕截图 2021-07-30 135240.png

    React 使用了 JSX,一种使用体验和模板相似的 JS 语法糖。

    JSX 是 JavaScript 的一种语法扩展,它和模板语言很接近,但是它充分具备 JavaScript 的能力。

    实际上浏览器并没有解析jsx的能力

    这里Babel将jsx转换为具有JavaScript的能力,Bable将jsx代码转换为大部分低版本浏览器也能够识别的 ES5 代码

    区别就在于多出了一层虚拟 DOM 作为缓冲层。这个缓冲层带来的利好是:当 DOM 操作(渲染更新)比较频繁时,它会先将前后两次的虚拟 DOM 树进行对比,定位出具体需要更新的部分,生成一个“补丁集”,最后只把“补丁”打在需要更新的那部分真实 DOM 上,实现精准的“差量更新”。这个过程对应的虚拟 DOM 工作流如下图所示:

    屏幕截图 2021-07-30 145238.png

    这里对diff算法没有做太多的解释,想了解的可以看看源码

    React 选用虚拟 DOM,真的是为了更好的性能吗?

    关于这个问题,可以看看大佬的回答(https://www.zhihu.com/question/31809713)

    其实虚拟dom的好处是“使得前端开发能够基于函数式 UI 的编程方式实现高效的声明式编程”
    虚拟 dom 的存在,不能片面的去说它解决了真实 dom 更新视图带来的性能问题,是提升视图渲染性能存在的。虚拟 dom 是让 diff 算法提供了可能。并且为编译多平台代码提供了可能,我们可以在虚拟 dom 转化为真实节点这一步,做跨平台的文章。还有一点便是提升开发体验和提高开发效率,让 ui=fn(state)这样数据驱动视图的函数式、声明式编程变为可能,JSX 便是其中一个品类。

    码字不易,请大佬指教!

  • 相关阅读:
    Python 学习笔记 11.模块(Module)
    Python 学习笔记 8.引用(Reference)
    Python 学习笔记 9.函数(Function)
    Python 学习笔记 6.List和Tuple
    Python 学习笔记 4.if 表达式
    Python 学习笔记 2.自省
    Python 学习笔记 3.简单类型
    Python 学习笔记 7.Dictionary
    Python 学习笔记 5.对象驻留
    Python 学习笔记 10.类(Class)
  • 原文地址:https://www.cnblogs.com/wsjaizlp/p/15093574.html
Copyright © 2020-2023  润新知