vue的生命周期都做了什么?

2023-10-08 22:20:04发布
28

beforeCreate

Vue 实例创建之前会执行它,此时 data 和 methods 中的数据或方法还未初始化,无法调用

示例代码:

<script>
export default {
  data() {
    return {
      msg: "小猪课堂",
    };
  },
  beforeCreate() {
    console.info("-----beforeCreate-----");
    console.info("data", this.msg);
    console.info("methods", this.getMsg);
  },
  methods: {
    getMsg() {
      return
    },
  },
};
</script>

输出结果:


created

该钩子函数是在 Vue 实例化之后执行的,此时 data 和 methods 已经初始化完成了,可以供我们调用,但是模板还没有编译,也就是我们还不能获取到 DOM。

示例代码:

created() {
  console.info("-----created-----");
  console.info("data", this.msg);
  console.info("methods", this.getMsg);
  console.info("el", this.$el);
},

输出结果:


可以看到 data 和 methods 可以获取到了,但是 el 节点还不能获取,因为此时模板渲染还没有开始。


beforeMount

该钩子函数在模板渲染之前调用,也就是 DOM 节点挂载到真实 DOM 树之前调用。此模板进行编译,会调用 render 函数生成 vDom,也就是虚拟 DOM,此时我们同样无法获取 DOM 节点。

示例代码:

beforeMount(){
  console.info("-----beforeMount-----");
  console.info("el", this.$el);
},

输出结果:

可以看到此时我们同样是无法获取 DOM 节点的,因为此时只存在 VDOM,还在 JS 级别。


mounted

执行该钩子函数时,我们的模板编译好了,而且挂载到真实 DOM 树上面去了,也就是我们的页面可以显示了。

示例代码:

mounted(){
  console.info("-----mounted-----");
  console.info("el", this.$el);
},

输出结果:

beforeUpdate

该函数在 data 数据发生变化之后调用,此时 data 里面的数据已经是最新的了,但是页面上 DOM 还没有更新最新的数据。

示例代码:

beforeUpdate() {
  console.info("-----beforeUpdate-----");
  console.info("data", this.msg);
},
methods: {
  getMsg() {
    return;
  },
  changeMsg() {
    this.msg = "更改后的小猪课堂";
  },
},

输出结果:

updated

该钩子函数会在 data 数据更新之后执行,而且此时页面也渲染更新完成了,显示的就是最新的数据。

示例代码:

updated(){
  console.info("-----updated-----");
  console.info("data", this.msg);
},
methods: {
  getMsg() {
    return;
  },
  changeMsg() {
    this.msg = "更改后的小猪课堂";
  },
},

输出结果:

注意:不要在 updated 中修改 data 数据,很容易造成死循环。


beforeDestroy

此钩子函数发生在 Vue 组件实例销毁之前,此时组件实际上还没有被销毁,还可以正常使用。我们通常会在这个钩子函数里面解除一些全局或者自定义事件。

示例代码:

beforeDestory(){
  console.info("-----beforeDestory-----");
  console.info("组件销毁之前");
},

destroyed

此钩子函数会在组件实例销毁之后执行,此时所有的组件包括子组件都被销毁了。

示例代码:

destroyed(){
  console.info("-----destroyed-----");
  console.info("组件被销毁");
},

通常这个时候只剩下了 DOM 空壳了。


补充

通常情况下我们切换路由等一些操作时,组件都会被销毁,切换回来的时候组件又重新渲染。但是有时候我们为了提高性能,我们可以在切换路由的时候不必销毁组件,这个时候我们就需要用到 Vue 的一个内置组件 keep-alive。

使用 keep-alive 组件包裹后的组件则不会被销毁,使用 keep-alive 这种方式之后,我们便会多出两个生命周期函数。

10.1 activated

页面渲染的时候执行。

示例代码:

<keep-alive>
  <router-view />
</keep-alive>
activated(){
  console.log("home 组件被渲染")
}

输出结果:

上段代码中我们将路由组件使用 keep-alive 包裹了起来,当我们第一次渲染组件的时候会执行组件的 mounted 钩子函数,但是当我们不停切换路由的时候,mounted 钩子函数没有被执行了,只执行了 activated 钩子函数,说明组件并没有被销毁。

10.2 deactivate

页面被隐藏或者页面即将被替换成新的页面时被执行。

示例代码:

deactivated(){
  console.info("deactivated 被执行")
}

输出结果:

当我们的组件将要被切换走的时候,会执行此钩子函数,有点类似于 beforeDestroy 钩子函数,但是效果完全是不一样的。