vue中modle→view的过程可细分为不同的阶段,每个阶段有对应的函数--生命周期函数(或称生命周期钩子).下面就说说这个过程中相关生命周期函数的作用
先准备一个div容器
<body>
<div>
<h2>当前的n值是:{{n}}</h2>
<button @click="addn">点我n+1</button>
</div>
</body>
创建vm实例
分析见注释
const vm = new Vue({
el: 'div',
data: {
n: 10,
},
methods: {
addn() {
this.n++
},
},
//开始创建虚拟dom
beforeCreate() {
//此时vm实例已被创建,但还没初始化
//此时找不到_data和methods,页面显示的是原始内容
console.log('beforeCreate');
console.log(this._data);//输出undefined
},
created() {
//此时已生成虚拟dom,即data中的数据已经放到了虚拟dom中,并存在内存中,但页面仍是原始内容(数据还没有被挂载到页面中去)
//此时可以通过vm实例找到_data和methods
console.log('created');
console.log(this._data);//可输出_data对象
},
//虚拟dom准备完毕
beforeMount() {
//此时dom编译(create)完毕,但还没挂载(beforeMount)
//此时可对vm中的data进行修改,但不会被渲染到页面上
console.log('beforeMount');
this.n = 20;//在此阶段修改vm的data中n的值
console.log(this.n);//输出20,说明n的值在虚拟dom中已经被改变
//debugger;//卡断点,发现页面中的n并没有被渲染,仍是{{n}}
},
mounted() {
//此时页面显示的内容就已经是Vue解析过后的内容
console.log('mounted');
this.n = 30;
console.log(this.n);//输出30
debugger;//卡断点,此时页面上n的值仍显示为20,可知此时模板还没被挂载到页面上,所以此时还可以更新模板的数据
//至此初始化过程结束,此时对dom的修改有效,不过Vue刚渲染完dom,一般不建议在此时进行修改
//一般在这个时候可进行:
//开启定时器,发送网络请求,订阅消息,绑定自定义事件,等初始化操作
},
//上述即是挂载流程
//上述所有阶段之后,Vue就将虚拟dom转换成真实dom渲染到页面里面去了
beforeUpdate() {
//当vm中的值发生修改时会被调用,用于更新虚拟dom的数据
//此时(虚拟dom中的)数据是新的,但页面还是旧的
//点击按钮改变n的值
console.log('beforeUpdate');
console.log(this.n);
//debugger;//此时页面仍是30,但输出的n是31
},
updated() {
//数据是新的,页面也是新的
console.log('updated', this.n + 2);//输出23
//debugger;
},
//以上就是model→view的过程
});