• Virtual DOM(虚拟DOM)


    Virtual DOM · GitBook https://nervjs.github.io/docs/guides/virtual-dom.html

    Virtual DOM

    Virtual DOM(虚拟DOM)是NervReact上继承的一项非常优秀的技术思想。

    DOM,文档对象模型,它是JavaScript与页面元素交互的桥梁,可以让我们使用JavaScript去方便地修改、添加页面元素。但我们都知道,直接操作DOM性能较差,人为去操作DOM可能会产生一些性能糟糕的修改,而且手工去修改DOM、维护DOM状态的成本非常高,这些都非常令人痛苦。

    而为了解决操作DOM的痛点,React另辟蹊径地引入了虚拟DOM的思想。虚拟DOM是对真实DOM的抽象描述,它的运行机制是这样的:

    • 创建,首先根据数据创建出虚拟DOM对象树,它将描述真实DOM树对应的每个节点的类型、属性,以及它的子节点,由虚拟DOM树我们可以创建出真实DOM树
    • 修改,随后,如果数据发生改变,我们就能创建出一颗新的虚拟DOM树
    • 对比更新,将新、旧虚拟DOM树进行比较、得出差异这样就能对之前生成的真实DOM做出相应的修改。

    Nerv中我们是使用Nerv.createElement() 这个方法来创建虚拟DOM的,这个方法接受三个参数,第一个是节点类型,第二个参数是节点属性,第三个是拥有的子节点,例如

    import Nerv from 'nervjs'
    
    // 创建一个简单DIV
    const divSimple = Nerv.createElement('div', {
      id: 'divSimple',
      className: 'div_simple',
      style: {
        fontSize: 80,
        color: '#232323'
      }
    })
    // => <div id="divSimple" class="div_simple" style="font-size: 80px;color: #232323;"></div>
    
    // 创建一个包含文字的DIV
    const divWidthText = Nerv.createElement('div', {
      id: 'divWidthText',
      className: 'div_width_text',
      style: {
        fontSize: 80,
        color: '#232323'
      }
    }, 'Hello, world!')
    
    // => <div id="divWidthText" class="div_width_text" style="font-size: 80px;color: #232323;">Hello, world!</div>
    
    // 创建一个包含多个子元素的DIV
    const divWidthChildren =
      Nerv.createElement('div', { id: 'divWidthChildren'},
        Nerv.createElement('p', { className: 'paragraph' }, '1'),
        Nerv.createElement('p', { className: 'paragraph' }, '2'),
        Nerv.createElement('p', { className: 'paragraph' }, '3'))
    
    // => <div id="divWidthChildren"><p class="paragraph">1</p><p class="paragraph">2</p><p class="paragraph">3</p></div>
    

    通过调用Nerv.createElement()方法就可以得到我们想要的虚拟DOM树,但是如果我们的代码都这样来写的话就会显得非常繁琐了,代码看起来也会非常枯燥,所以我们可以换一种写法,使用JSX语法来书写创建虚拟DOM的代码。

    JSX语法是一种类似XML的JavaScript扩展,它可以让我们在JavaScript中书写类似XML的代码,以此来简化上文中通过调用Nerv.createElement()方法来创建虚拟DOM的代码,例如,上述代码可以简化成

    const divSimple = <div id='divSimple' className='div_simple' style={{fontSize: 80, color: '#232323'}}></div>
    
    const divWidthText = <div id='divWidthText' className='div_width_text' style={{fontSize: 80, color: '#232323'}}>Hello, world!</div>
    
    const divWidthChildren = (
      <div id='divWidthChildren'>
        <p className='paragraph'>1</p>
        <p className='paragraph'>2</p>
        <p className='paragraph'>3</p>
      </div>
    )
    

    再配合相应工具,就可以将代码转换成正常的创建代码,更多JSX相关内容请参考JSX这一章节


     

  • 相关阅读:
    常用: JS 获取浏览器窗口大小
    教你开发jQuery插件
    JS基础篇--JS的event.srcElement与event.target(触发事件对象)
    javascript中基本类型和引用类型的区别分析
    代码风格与文件模板
    定制外观
    安装与使用
    with as 如何工作
    面向对象进阶
    mro具体解释
  • 原文地址:https://www.cnblogs.com/rsapaper/p/14753839.html
Copyright © 2020-2023  润新知