1.定义及作用
-
定义:每个
Vue
实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到DOM
、在数据变化时更新DOM
等,不同的时期对应不同的周期; - 生命周期钩子:不同周期开放出来的接口;
- 作用:可以在特定的时期添加需求,比如请求后台数据等;
2.生命周期钩子函数使用
-
demo Code
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
没有生成;//看看源码,创建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
实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁,此时再改变属性已经不再起作用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。