虚拟 DOM 的样貌

Vue

  1. const vNode = {
  2. tag: "div", // 标签名 or 组件名
  3. data: {
  4. class: "red", // 标签上的属性
  5. on: {
  6. click: () => {} // 事件
  7. }
  8. },
  9. children: [ // 子元素们
  10. { tag: "span", ... },
  11. { tag: "span", ... }
  12. ],
  13. ...
  14. }

React

  1. const vNode = {
  2. key: null,
  3. props: {
  4. children: [ // 子元素们
  5. { type: 'span', ... },
  6. { type: 'span', ... }
  7. ],
  8. className: "red" // 标签上的属性
  9. onClick: () => {} // 事件
  10. },
  11. ref: null,
  12. type: "div", // 标签名 or 组件名
  13. ...
  14. }

创建虚拟 DOM

Vue(只能在 render 函数里得到 h)

  1. h('div', {
  2. class: 'red',
  3. on: {
  4. click: () => { }
  5. },
  6. }, [h('span',{},'span1'), h('span', {}, 'span2'])

React.createElement

  1. createElement('div',{className:'red',onClick:()=> {}},[
  2. createElement('span', {}, 'span1'),
  3. createElement('span', {}, 'span2')
  4. ]
  5. )

用 JSX 简化创建虚拟 DOM

React JSX

  1. <div className="red" onClick="{()=> {}}">
  2. <span>span1</span>
  3. <span>span2</span>
  4. </div>
  • [x] 通过babel转为createElement形式

    Vue Template

    1. <div class="red" @click="fn">
    2. <span>span1</span>
    3. <span>span2</span>
    4. </div>
  • [x] 通过vue-loader转为h形式

那么这样写的缺点是什么:需要添加额外的构件过程(babelvue-loader

关于虚拟 DOM 的一些测试

  • JS 创建1000个节点,慢的是浏览器渲染的时间慢(渲染过程,会导致 JS 不可交互)
  • 当创建节点的数目没有到很恐怖的时候
  • (比如10W个节点)JS(130ms就完成JS,大概2s才完成浏览器渲染,中间间隔的时间称之为不可交互时间)比虚拟DOM(Vue还是挺快的(大概3s),React需要30s,比较慢)更快
  • 可能原因是:Vue本身就已经优化过,React没有优化

    总结:在节点数目没有到达很恐怖的数据时,虚拟DOM比原生的更快