Vue 的实例是有生命周期的,在 Vue 的实例创建的过程中会经历一系列关键的过程,如数据观测、模板编译、挂载 DOM 元素、数据更新导致 DMO 更新、以及实例销毁,当 Vue 创建实例执行到这些关键步骤时,可以执行一些钩子函数,我们称这些函数为生命周期函数;学习 Vue 生命周期的钩子函数,要掌握每个钩子函数中 Vue 的实例所处的状态,以及我们在这些钩子中能干啥
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div>hahahhahah</div>
<button @click="fn">{{msg}}</button>
</div>
<script src="vue.js"></script>
<script>
let vm = new Vue({
// el: '#app',
data: {
msg: 'hello'
},
methods: {
fn() {
console.log('hello world');
}
},
beforeCreate() {
// 在实例初始化以后,数据观测、watch 配置之前被调用;data 中的数据还没有代理到 vm 上,侦听器没有配置;
// 不能通过 this 访问 data 中的数据;
console.log(1);
// console.log(this);
console.log(this.msg); // undefined
console.log(this.$el); // this.$el 是根 DOM 节点,此时还没挂载,所以是 undefined
},
created() {
// 在实例创建完成后被调用,此时数据观测、计算属性、事件绑定、 watch 都已配置完成;可以通
// 过 this 访问 data 中的数据;
// 但是还没有挂载到根 DOM 元素,所以 this.$el 不可见
console.log(2);
console.log(this.msg); // hello
console.log(this.$el); // undefined
// 我们一般在这个钩子中发送 ajax 请求
},
beforeMount() {
// 在挂载之前被调用,创建虚拟 DOM(Virtual DOM);把模板编译成虚拟 DOM,虚拟 DOM 不是真正的 DOM 元素,而是 JS 对象,这些对象中包含了它变成真正的 DOM 元素所必须的东西;
//模板: <div @click="fn"> <span>{{msg}}</span> </div>
// VNode 如下
let obj = {
tagName: 'div',
innerText: '',
children: [
{
tagName: 'span',
innerText: 'hello'
}
],
event: {
click: function() {}
}
};
// 挂载后变成真实的元素:<div> <span>hello</span> </div>
console.log(3);
console.log(this.msg); // hello
console.log(this.$el); // div#app 在这里就能访问 this.$el
},
mounted() {
// Vue 把虚拟 DOM 挂载到真实的 DOM 元素上
// 如果我们操作 DOM,一般在这个钩子中获取 DOM 元素
// ajax 也可以在这个钩子中发送
console.log(4);
console.log(this.msg); // hello
console.log(this.$el); // div#app 这里面的所有模板语法都被替换成真实的数据了
},
beforeUpdate() {
// 只有数据发生改变的时候才会触发这个钩子,并且发生在更新视图之前;
console.log(5);
},
updated() {
// 由于数据更新导致的虚拟 DOM 重新渲染和打补丁(把更改的部分修改成最新的视图),在这之后会调用该钩子;
console.log(6);
},
beforeDestroy() {
// 在 Vue 的实例被销毁之前调用,此时实例中所有的东西都是可用的;
// 如果页面(组件中)有定时器,要在这个钩子中清除定时器;
console.log(7);
},
destroyed() {
// Vue 的实例被销毁之后调用,数据不再是响应式的,watch 也会被销毁;如果修改数据,页面不会再更新了。
console.log(8);
}
});
// vm.$set(vm, 'msg', 'HELLO WORLD'); // 修改数据才会触发 beforeUpdate 和 updated
// vm.$destroy() 销毁 Vue 实例的方法;
vm.$mount('#app'); // vm.$mount('根DOM节点') 手动挂载,当需要动态挂载的时候需要这个方法;
// 什么时候会销毁?
// 1. 动态组件切换时,被切走的那一个组件会销毁;
// 2. 单页面应用切换路由时,上一个组件会被销毁;
</script>
</body>
</html>