页面表现
- v-if
- true: 显示DOM
- false: 用注释节点占位
- 注释节点与DOM之间的切换
- v-show
- true: 不作处理(用户自己设置的
display
)
- false: 行内样式设置**
display: none
**
- 行内样式:style or style="display: none"
实现
思路
- 对 data 进行数据劫持
- 分析 ast 数,找到元素绑定的
v-if
以及 @methods
事件函数
- 分别放进 showPool 和 eventPool 中(数据格式为
Map
)
- showPool 数据格式
- key: DOM对象
- value:
{ type: 'if/show', prop: data.xxx }
- eventPool 数据格式
- key: DOM对象
- value:
methods.xxx 方法
- 绑定事件处理函数
- 初次渲染
- 如果遇到 v-if ,先给 showPool 中对应 value 加个 comment 注释节点用于后续占位
- 用户触发
methods
事件函数
- data数据更新
- 触发了属性 setter
- 进行
update
更新页面
函数
initData
数据响应式
- 参数:
- vm 实例(获取 vm.$data)
- showPool(setter 触发,在 showPool 中找对应dom)
initPool
v-if、v-show、event 放进对应 pool
- 参数:
- template(ast树分析模板)
- methods(找到事件函数)
- showPool
- eventPool
bindEvent
事件绑定
- 参数:
- vm 实例(需要把方法放进实例)
- eventPool(遍历 eventPool 挂载方法到 实例 上)
render
页面渲染
- 参数:
- vm 实例(vm.$data 查模板绑定的属性;vm.$el 找到根容器最后把模板 append 进去)
- showPool(遍历 pool 根据绑定属性的 true、false 初始化页面的显示状态)
- container(append 进根容器)
update
页面更新
- vm 实例(获取属性值)
- key(那个属性更新了)
- showPool(找到相应key的DOM更新)
showPool:
eventPool: