最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Virtual DOM

    正文概述 掘金(cAuth)   2020-12-13   377

    什么是虚拟DOM

    简单地说虚拟DOM其实就是使用JavaScript对象的形式来一个DOM节点,包含了typepropschildren三个属性:

    <div class="container">
      hello world
    </div>
    

    将?上面的HTML代码以虚拟DOM的形式表示:

    {
      type: 'div',
      props: {
        className: 'container'
      },
      children: [
        "hello world"
      ]
    }
    

    因为DOM树?是一个树形的结构,所以使用JavaScript对象就可以表示出树的结果。HTML和虚拟DOM有点类似于XMLJSON,使用不同的形式来表示相同的数据。

    虚拟DOM的好处

    需要注意的是虚拟DOM不一定比真实的DOM操作快JavaScript引擎和DOM引擎使用的是同一个主线程,任何涉及到DOM的操作都需要先把JavaScript的数据结构转换为DOM的数据结构,再将JavaScript引擎挂起执行DOM引擎,执行完成后再切换执行JavaScript引擎,这种上下文的切换是很消耗性能的,所以解决DOM操作的性能问题的关键在于减少不必要的DOM操作

    那么虚拟DOM没有带来任何的性能的优化吗?也不是这样!虚拟DOM能够实现最细粒度的更新你的DOM,对于DOM操作我更新DOM的常见做法是使用innerHTML,但是innerHTML的JavaScript计算和DOM操作通常和你的界面数据大小挂钩,即innerHTML的时间复杂度O = JavaScript操作时间 + 重新创建所有DOM元素的时间;而虚拟DOM更新UI界面的时间复杂度O = 渲染虚拟DOM + diff + 必要的DOM更新,渲染虚拟DOM和diff操作都是JavaScript计算不会涉及到JavaScript引擎和DOM引擎的上下文切换。所以虚拟DOM不管每次的数据变化是怎样的,每次重绘的对于DOM的操作都是最小的。

    虚拟DOM最大的好处在于抽象了渲染的过程,为应用带来了跨平台的能力,不再是仅仅局限于浏览器端。比如React-NativeWeeX可以运行在Android、IOS平台上。

    真实DOM到虚拟DOM的映射

    借助@babel/plugin-transform-react-jsx可以实现从真实DOM到虚拟DOM的转换。

    1.安装babel依赖:npm i -D @babel/cli @babel/core @babel/plugin-transform-react-jsx

    2.配置 .babelrc:

    // .babelrc文件
    {
      "plugins": [
        ["transform-react-jsx", {
          "pragma": "h"
        }]
      ]
    }
    

    下面?就可以借助babel来将真实DOM转换为虚拟DOM

    新建index.js文件?:

    function toVDOM() {
      return (
        <ul className="group">
          <li className="item">吃饭</li>
          <li className="item">睡觉</li>
          <li className="item">打代码</li>
        </ul>
      )
    }
    

    执行命令npx babel main.jsx --out-file vdom.js后得到:

    function toVDOM() {
      return h("ul", {
        className: "group"
      }, h("li", {
        className: "item"
      }, "吃饭"), h("li", {
        className: "item"
      }, "睡觉"), h("li", {
        className: "item"
      }, "打代码"));
    }
    

    所以我们只需要实现h函数就能得到虚拟DOM了。

    function h(type, props, ...children) {
      return {
        type,
        props: props || {},
        children: children.flat()
      }
    }
    

    render函数

    上面我们已经实现了真实DOM到虚拟DOM的转换,接下来我们将实现render函数将虚拟DOM渲染成真实DOM

    function render(element, container) {
      const { type, props = {}, children = [] } = element;
      const dom = typeof element === 'number' || typeof element === 'string' ? document.createTextNode(element) : document.createElement(type);
    
      Object.keys(props).forEach(p => {
        dom[p] = props[p]
      });
    
      children.forEach(c => {
        render(c, dom)
      });
    
      container.appendChild(dom);
    }
    

    将通过h函数生成的虚拟DOM传入到render函数中就能实现将虚拟DOM渲染成真实DOM了:

    render(element, document.getElementById('app'))
    

    Virtual DOM

    接下来的更新写作内容

    • 虚拟DOM的更新

    下载网 » Virtual DOM

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元