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时,如果对象嵌套对象,需要通过递归,不断的对对象实现监听