zoukankan      html  css  js  c++  java
  • 认识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 便是其中一个品类。

    码字不易,请大佬指教!

  • 相关阅读:
    提问回顾
    个人阅读作业+个人总结
    结对项目-数独程序扩展
    个人作业-Week 3
    个人作业-Week 2
    个人项目-数独程序
    个人作业-Week 1
    第0次博客作业
    2017[BUAA软工]第0次个人作业
    [2017BUAA软工]提问回顾
  • 原文地址:https://www.cnblogs.com/wsjaizlp/p/15093574.html
Copyright © 2011-2022 走看看