Virtual DOM
JS对象来描述DOM对象。不是真实的DOM对象。
为什么使用Virtual DOM
- 手动操作DOM比较麻烦 还要考虑浏览器兼容性 随着项目的复杂DOM会越来越复杂
- 为了简化视图操作 使用模板引擎 但不能更好的解决跟踪状态的改变
- 当状态改变时不需要立即更新DOM 只会创建一个虚拟树来描述DOM 虚拟DOM内部将弄清楚如何有效DIFF更新DOM
- 虚拟DOM可以维护程序的状态,跟踪上一次的状态
- 通过比较前后两次的状态差异更新真实的DOM
作用
- 维护视图和状态的关系
- 复杂视图情况下提升渲染性能
- 除了渲染DOM以外 还可以实现SSR 原生 小程序等
Virtual DOM 库
- Snabbdom (VUE2.0内部使用)
- virtual-dom
Snabbdom 库
核心
- 使用h()函数创建JS对象来描述真实DOM
- init()设置模块 创建patch()
- patch() 比较新旧两个vnode
- 把变化的内容更新到真实的DOM树上
- h() 函数
创建vnode,调用vnode函数返回虚拟节点
new Vue render也使用了h函数 - Vnode
- patch
patch(oldVnode,newVnode)
diff过程 更新同级别的比较 - init
- createElm
- addVnodes removeVnodes
- patchVnode
1.创建项目
1 | - src/index.js |
1 | { |
2.导入及使用
1 | import { h, thumk, init } from 'snabbdom' |
1 | import { h, init } from 'snabbdom' |
3.使用模块
核心库不能处理元素的属性样式事件,提供了常用模块
- attributes 设置DOM属性 setAttribute()
- props 设置DOM属性 element[attr] = value
- class 样式
- dataset 设置data-*自定义属性
- eventlisteners 注册和移除事件
- style 设置行内样式
1 | // 导入模块 |