JS前端开发模拟虚拟dom转真实dom详解

 更新时间:2023年01月10日 10:06:40   作者:前端兰博  
这篇文章主要为大家介绍了JS前端开发模拟虚拟dom转真实dom详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

经常使用Vue或React的小伙伴肯定对虚拟dom这个词不陌生,虚拟dom的设计是推进前端框架发展的一大变革。今天带大家简单模拟下虚拟dom转换真实dom的js设计。废话不说了,上车吧。

虚拟dom的介绍

介绍

虚拟dom本质是一段js代码,用来模拟dom树的结果。

如下是对一段虚拟dom模拟真实dom的例子

真实dom

<div class="box">
    <p name="dog">xiao ming</p>
  </div>

虚拟dom

 let vnode = {
  tag:"div",
  attrs:{
    class:["box"]
  },
  childrens:[
    {
      tag:"p",
      attrs:{
        name:"dog"
      },
      childrens:[
        {
          tag:'text',
          content:"xiao ming"
        }
      ]
    }
  ]
}

优势

  • 跨平台
  • 虚拟dom配合diff算法在快速更新dom的同时,可以减少页面的重拍与重绘
  • 虚拟dom解放了前端程序员的思想,彻底抛弃了早期大量操作dom的工作,而是将工作重点放在了数据和逻辑的设计。从此不再被后端程序员嘲笑为切图崽

缺点

页面有大量dom时,性能可能没有原生dom效率高。(原因:虚拟dom本质还是用js描述dom树,所以当页面dom比较多时,js操作与diff算法需要耗费额外的性能较大)

虚拟dom转换真实dom

终于来到了今天的主角,通过设计虚拟dom转换真实dom的过程,可以更加清晰其工作原理和设计过程,同时也能让各位在面试中如鱼得水,码上拈来。

const vnode = {
  tag: 'DIV',
  attrs: {
      id: 'app'
  },
  children: [{
          tag: 'SPAN',
          children: [{
              tag: 'A',
              children: []
          }]
      },
      {
          tag: 'SPAN',
          children: [{
                  tag: 'A',
                  children: []
              },
              {
                  tag: 'A',
                  children: []
              }
          ]
      }
  ]
}
/*虚拟dom转换真实dom设计*/
function render(vnode) {
  //核心递归函数
  const main = (node,parent=null) => {
    let ele
    ele = document.createElement(node.tag.toLowerCase())
    //添加属性
    if(node.attrs) {
      for(let key in node.attrs) {
        ele.setAttribute(key,node.attrs[key])
      }
    }
    //添加孩子,递归
    if(node.children && node.children.length) {
      for(let val of node.children) {
        main(val,ele)
      }
    }
    if(parent) {
      parent.appendChild(ele)     
    }else{
      parent = ele
    }
    return parent
  }
  let dom = main(vnode)
  return dom
}
render(vnode)

效果

总结

以上是我对虚拟dom的简单总结和虚拟dom转换方法的设计,更多关于JS模拟虚拟dom转真实dom的资料请关注脚本之家其它相关文章!

相关文章

  • 通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法

    通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法

    这篇文章主要介绍了通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 关于ES6的六个小特性(二)

    关于ES6的六个小特性(二)

    ES6提供了大量新的好的东西,在过去的一年内,浏览器提供商做了大量的辛勤工作将新的语言特性更新到他们的浏览器中。尽管有重大的更新,很多小的语言更新另我眼前一亮,下面这篇文章主要介绍了关于ES6的六个小特性,需要的朋友可以参考下。
    2017-02-02
  • 浅谈JavaScript 代码整洁之道

    浅谈JavaScript 代码整洁之道

    这篇文章主要介绍了浅谈JavaScript 代码整洁之道,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 浅谈JavaScript中的parseInt()的妙用

    浅谈JavaScript中的parseInt()的妙用

    本文主要介绍了JavaScript中的parseInt()的妙用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • TypeScript中类型映射的使用

    TypeScript中类型映射的使用

    TypeScript中的映射类型和数学中的映射类似,能够将一个集合的元素转换为新集合的元素,本文就来介绍一下TypeScript中类型映射的使用,感兴趣的可以了解一下
    2023-10-10
  • 利用r.js打包模块化的javascript文件方法示例

    利用r.js打包模块化的javascript文件方法示例

    这篇文章主要给大家介绍了利用r.js打包模块化的javascript文件的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起看看吧。
    2017-06-06
  • 网页挂马方式整理及详细介绍

    网页挂马方式整理及详细介绍

    这篇文章主要介绍了网页挂马方式整理及详细介绍的相关资料,这里整理了不少方式,大家可以看下如何实现的,需要的朋友可以参考下
    2016-11-11
  • JavaScript实现谷歌浏览器插件开发的方法详解

    JavaScript实现谷歌浏览器插件开发的方法详解

    对于浏览器插件相信大家都不陌生,谁的浏览器不装几个好用的插件呢,更是有油猴这个强大的神器。所以本文就来用JavaScript开发一个谷歌浏览器插件,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Javascript异步编程之你真的懂Promise吗

    Javascript异步编程之你真的懂Promise吗

    这篇文章主要介绍了Javascript异步编程之Promise,想了解异步编程和Promise的同学,可以参考下
    2021-04-04
  • 跟我学习javascript的基本类型和引用类型

    跟我学习javascript的基本类型和引用类型

    跟我学习javascript的基本类型和引用类型,利用图解的方式,告诉大家javascript的基本类型和引用类型的区别和联系,感兴趣的小伙伴们可以参考一下
    2015-11-11

最新评论