1.定义及做用vue
Vue
实例在被建立以前都要通过一系列的初始化过程。例如须要设置数据监听、编译模板、挂载实例到 DOM
、在数据变化时更新 DOM
等,不一样的时期对应不一样的周期;2.生命周期钩子函数使用react
demo Codeapp
app = new Vue({ el: '#app', data: { message : "vue demo"}, methods:{ methodsTest(){ return "methods test success"}}, computed:{ computedTest(){ return "computed test success"}}, beforeCreate:{……}, created:{……}, beforeMount:{……}, beforeUpdate:{……}, updated:{……}, beforeDestroy:{……}, destroyed:{……},} setTimeout(function () { app.message= 'vue data changed';},0) setTimeout(function () { app.$destroy(); app.message= 'vue data destroy'; },10)
$el
,data
,computed
,methods
beforeCreate
周期内,组件实例还未被建立 ,各属性均未生成;created
周期内,Init injections and reactivity
,这个阶段属性都已注入绑定,并且被$watch
变成reactivity
,可是$el
仍是没有生成,也就是DOM
没有生成;ide
//看看源码,建立Vue实例时候会经过this._init()初始化 function Vue (options) { if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } this._init(options) //初始化各个功能 } //在_init()中有这样的一个执行顺序:其中initState()是在 //beforeCreate和created之间 initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, 'beforeCreate') initInjections(vm) // resolve injections before data/props initState(vm) //初始化 initProvide(vm) // resolve provide after data/props callHook(vm, 'created') //在initState()作了这些事情: //因此Props,methods,data和computed的初始化都是在beforeCreated和created之间完成的。 if (opts.props) initProps(vm, opts.props)//初始化Props if (opts.methods) initMethods(vm, opts.methods)//初始化methods if (opts.data) { initData(vm)} else { observe(vm._data = {}, true /* asRootData */)}//初始化data if (opts.computed) initComputed(vm, opts.computed)//初始化computed
beforeMount
周期内,会判断options
(new Vue()
里面的大对象)里面是是否有$el
,有的话再看options
里面是否有template
;如果没有,在等待vm.$mount(el)
方法调用,为组件提供DOM
容器,若是都提供了teamplate
,则编译template
模板,如果没有模板,则编译el
里面的的元素。要注意的是此时只是编译了模板,尚未把属性挂载上去。mounted
周期内,属性均已挂载;beforeUpdated
,属性更新以前,注意此时属性已经发生变化 ;updated
,属性更新后;beforeDestroy
和destroyed
,组件销毁前;实例销毁以前调用。在这一步,实例仍然彻底可用。销毁后;Vue
实例指示的全部东西都会解绑定,全部的事件监听器会被移除,全部的子实例也会被销毁,此时再改变属性已经再也不起做用。