Vue生命周期:一个Vue实例从创建到销毁的过程。 Vue组件也可以看成一个Vue实例。
Vue实例做了什么:
将模板内容编译,替换掉原有的html节点
1:模板内容:由template选项确定。
2:编译:将模板编译成真实的DOM,渲染/挂载到html中。
3:原有的html节点:由el选项确定。
created之前做了什么:
initLifecycle(vm) //初始化生命周期
initEvents(vm) //初始化事件
initRender(vm) //初始化渲染
callHook(vm, 'beforeCreate')/**initInjections与initProvide配套使用,将父组件_provided定义的值,通过inject注入到子组
件,且这些属性不会被观察
栗子:<div id="app">
<p>{{message}}</p>
<child></child>
</div>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
message: '第一个vue实例'
},
components: {
child: {
template: "<div>{{a}}</div>",
inject: ['a']
}
},
provide: {
a: 'a'
}
})
</script> */initInjections(vm)
/*主要操作数据 props、methods、data、computed、watch 以及Observer、 Dep和Watcher
数据代理 vm.msg 实际上访问的是vm._data.msg vm.$data实际访问的是vm._data
_data是Vue实例的私有属性 */initState(vm)
initProvide(vm)
callHook(vm, 'created')
//判断用户是否传入了el选项,传入了则调用mount函数,没传入则不执行mount相关的生命周期
//需要手动调用$mount方法挂载时 mount相关的生命周期被调用了 进入下一个生命周期阶段
if (vm.$options.el) {
vm.$mount(vm.$options.el)
}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="../node_modules/vue/dist/vue.js"></script> <title>Document</title> </head> <body> <div id="app"> app </div> </body> <script> const vm = new Vue({ // el:"#app",//指定渲染到哪个节点 data:{ msg:'hello vue' }, //编译模板,挂载到(替换掉)原有的节点(el指定的html节点) // 1:编译模板 解析template中的内容 将{{msg}}替换成hello vue 变成 <div>hello vue</div> // 2: 将编译后的结果<div>hello vue</div>,挂载到el指定的dom元素 <div id="app"></div> template:'<div>{{msg}}</div>', methods:{ init(){ console.log("方法"); } }, /* beforeCreate vue实例刚创建出来,还没有初始化Vue实例中的数据和方法 不可以访问 data和 methods 获取不到$el */ beforeCreate :function() { console.log(this.msg);//undefine console.log(this.init);//undefine }, /* vue实例创建完成 created函数 完成对data的里的数据初始化,响应式 最早可以处理数据相关逻辑的生命周期函数 可以访问data,methods ,props,compute,watch 获取不到$el,不可以进行dom操作 */ created: function(){ console.log(this.msg);//vue console.log(this.init);//方法 console.log("created...",this.$el);//undefined }, /* beforeMount 完成了模板的编译,根据data中的数据和指令生成了html,还没有渲染 仅在内存中,但是还没 有挂载到页面中 最后一次处理data数据的生命周期函数 */ beforeMount () { console.log("beforeMount...",this.$el); <div id="app">app</div> }, /* 手动写render, return 的节点 代替了templalte的模板内容 没有手写render 会根据template生成render函数 */ render(h){ return h('h2',{},this.msg) }, /* 调用mouted时,表示Vue已经编译好了最终模板,可以拿到渲染之后的内容了 进行dom操作 */ mounted () { console.log("mounted...",this.$el);//挂载后 模板编译后的内容替换掉原有的el指定的dom元素 }, <h2>hello vue</h2> beforeUpdate () { console.log(this,"beforeUpdate"); }, updated () { console.log(this,"updated"); }, beforeDestroy () { console.log(this,"beforeDestroy"); }, destroyed () { console.log(this,"destroyed"); } }) /* 没有指定el的内容时,需要手动调用mount 触发beforeMount,mount生命周期函数 */ vm.$mount('#app') </script> </html>