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); // undefinedconsole.log(this.$el); // this.$el 是根 DOM 节点,此时还没挂载,所以是 undefined},created() {// 在实例创建完成后被调用,此时数据观测、计算属性、事件绑定、 watch 都已配置完成;可以通// 过 this 访问 data 中的数据;// 但是还没有挂载到根 DOM 元素,所以 this.$el 不可见console.log(2);console.log(this.msg); // helloconsole.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); // helloconsole.log(this.$el); // div#app 在这里就能访问 this.$el},mounted() {// Vue 把虚拟 DOM 挂载到真实的 DOM 元素上// 如果我们操作 DOM,一般在这个钩子中获取 DOM 元素// ajax 也可以在这个钩子中发送console.log(4);console.log(this.msg); // helloconsole.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>
