vue运行过程
new Vue()
,创建Vue实例化对象- vue初始化
init
,在这个过程中会初始化生命周期
,执行beforeCreated
,初始化data
,props
,computed
,watcher
,执行created
- 初始化后,对vue实例进行挂载,如果没有
render
方法,定义了template
,执行编译阶段,开始解析template
,将template
编译成render function
beforeMounted
阶段将通过vue的render
方法将生成虚拟DOMmounted
阶段,将虚拟DOM转化成真实的DOM文档,进行页面渲染,并完成数据双向绑定
什么是响应式
不直接操作dom
,当数据改变时,通过监听更新到到视图上,当视图上的改变,比如某个事件的操作,也会反过来更新数据.
vue2.x响应式
- 在vue初始化
init
阶段,初始化数据,创建一个数据源data
,构建一个Observer
(数据观察者)对象,该对象会调用defineReactive
(defineReactive通过Object.defineProperty设置对象的key属性)拦截每个属性的getter
,setter
方法 - 在触发
render function
阶段,将与vue实例中和视图相关的数据通过getter
进行依赖收集,(依赖收集器中内置一个watcher
的数据订阅者) - 当数据发生变化,会被
Observer
观察到,触发setter
,然后有依赖收集器(Dep实例的
notify)通知到watcher
并通知视图进行变化
vue2.x响应式弊端
Object.defineProperty
无法对属性进行响应式监听,所以如果对数组中某个索引进行修改,删除,新增等操作需要使用vue.set
,vue.delete
的方法Object.defineProperty
设置setter
,getter
时,如果对象嵌套对象,需要通过递归,不断的对对象实现监听