GitHub 地址 https://github.com/snabbdom/snabbdom#readme

  1. //我们在页面先生成2个列表
  2. const container = document.getElementById('container')
  3. // 生成vnode
  4. const vnode = h('ul#list', {}, [
  5. h('li.item', {}, 'Item 1'),
  6. h('li.item', {}, 'Item 2')
  7. ])
  8. patch(container, vnode)
  9. // 然后点击按钮更换内容
  10. document.getElementById('btn-change').addEventListener('click', () => {
  11. const newVnode = h('ul#list', {}, [
  12. h('li.item', {}, 'Item 1'),
  13. h('li.item', {}, 'Item B'),
  14. h('li.item', {}, 'Item 3')
  15. ])
  16. patch(vnode, newVnode)
  17. })

然后在点击时,可以看到 屏幕录制2020-10-19 下午7.22.00.mov (1.17MB)只更新了需要更新的dom,在虚拟dom中计算出了差别,以最小化代价去修改页面。

vdom小结

  • 用JS模拟DOM结构(vnode)
  • 新旧vnode对比,得出最小的更新范围,最后更新DOM
  • 数据驱动视图的模式下,有效控制DOM操作