行文介绍
本文通过一张流程图来简要的分析vue的【初始化,模板编译,数据响应式,数据驱动视图】的流程。
目的是理清思路。想看详情的请看文末参考链接,或者查找其他文档,因为每一块的内容都是很多的。
流程图
搭配
本文可以搭配我写的 从new Vue()看源码流程 食用。这篇文章主要是从源码来梳理流程。
流程分析
- 初始化以及挂载
init, mount
- 在进行模板编译
compile
,将template
编译为渲染函数render function
- 执行
render function
生成Virtual DOM
,render function => VNode tree
- 再进行响应式依赖收集,
render function => getter, setter => Watcher.update => patch
。以及使用队列进行异步更新的策略。 - 通过
diff
算法后进行patch
更新视图
问题
问题来源
有这个问题是因为受这篇神文的影响剖析Vue原理&实现双向绑定MVVM。它这里面是精确收集的watcher,数据更新时直接更新指定的dom内容,非常高效。但是vue源码中并没有类似的实现。
数据变化时是【触发精确watcher,直接更新指定DOM】,还是【触发render watcher, 然后走patch流程】?
答案是【触发render watcher, 然后走patch流程】。
而且在源码中打断点,也可以发现,当改变一个data时是会触发render watcher
的。
vue中有三种watcher
- render Watcher
- computed Watcher
- watch Watcher
不信的,请vue源码中搜索 new Watcher
即可发现只有三处。(目前vue@2.6.10, 以后的版本不敢保证)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。