一、什么是虚拟DOM

一个能表示DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其他属性

二、虚拟DOM有什么优点

1. 减少DOM操作

  • 虚拟DOM可以将多次操作合并为一次操作。
  • 虚拟DOM借助DOM diff 可以将多余的操作省略

2. 跨平台

  • 虚拟DOM不仅可以变成DOM,还可以变成小程序、iOS应用,因为虚拟DOM本质是JS对象

三、虚拟DOM有什么缺点

需要额外的创建函数,如createElement 或 h,但可以通过 JSX 来简化成 XML 语法

四、虚拟DOM是什么样子

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",
  13. ...
  14. }

Vue

  1. const vNode = {
  2. tag: 'div',
  3. data: {
  4. class: 'red',
  5. on: {
  6. click: ()=>{}
  7. }
  8. },
  9. children: [
  10. {tag: "span", ...},
  11. {tag: "span", ...}
  12. ],
  13. ...

五、如何创建虚拟DOM

React

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

Vue

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

React JSX

  1. <div className="red" onClick="{fn}">
  2. <span>span1</span>
  3. <span>span1</span>
  4. </div>

Vue Template

  1. <div class="red" @click="fn">
  2. <span>span1</span>
  3. <span>span1</span>
  4. </div>

六、什么是DOM diff

DOM diff其实就是一个函数,它会对比 oldNode 与 newNode 的区别。从而减少不必要的渲染。但是DOM diff会有bug。造成页面渲染的误操作,可以使用key来辅助diff的对比。从而消除bug。