12-vue2生命周期

Huxzhi大约 3 分钟

12-vue2 生命周期

8 个生命周期 created mounted updated destoryed

https://v2.cn.vuejs.org/v2/guide/instance.htmlopen in new window

vue 生命周期分别有创建、初始化数据、编译模板、挂在 DOM、渲染-更新-渲染、卸载利用钩子函数完成对应的项目效果

beforeCreate( 创建前 )

在实例化之后,数据的观测和事件的配置之前的时候调用,此时组件的选项对象还未创建,el 和 data 并未初始化,因此无法访问 methods, data, computed 等上的方法和数据

created ( 创建后)

在创建之后使用,主要用于数据观测、属性和方法的运算,watch/event 事件回调,完成了 data 数据的初始化,el 没有。 然而,挂在阶段还没有开始.

beforeMount (挂载前)

用于在挂载之前使用,在这个阶段是获取不到 dom 操作的,把 data 里面的数据和模板生成 html,完成了 data 等初始化,注意此时还没有挂在 html 到页面上

mount (挂载后)

用于挂载之后使用,在这个时候可以获取到 dom 操作,比如可以获取到 ref 等,操作的 dom, 在这个时候只能调用一次 ajax,在这个时候 el 和 data 都可以获取的到

beforeUpdate (更新前)

在数据更新之前被调用,发生在虚拟 DOM 重新渲染,可以在该钩子中进一步地更改状态,不会触发重复渲染过程

updated (更新后)

在由于数据更改导致地虚拟 DOM 重新渲染会调用,调用时,组件 DOM 已经更新,所以可以执行依赖于 DOM 的操作,然后在大多是情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环,但是在服务器端渲染期间不被调用,可以用于监听某些数据的时候使用钩子

beforeDestroy(销毁前)

在这个时候还是可以用 this 来获取,可以用于销毁计时器时候使用,为了防止跳转到其它页面该事件还在执行,还可以清除 dom 事件等

destroy(销毁后)

在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁.

<!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" />
    <title>Document</title>
    <script src=" https://cdn.jsdelivr.net/npm/vue@2.7.8"></script>
  </head>
  <body>
    <div id="app">{{msg}}</div>
    <button id="btn">click me</button>
  </body>
</html>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      msg: "Hello world",
      msg2: "sss",
    },
    beforeCreate() {
      console.log(
        "beforeCreate: 挂载了vue实例的方法,但是data没有挂载",
        this.msg
      );
    },
    created() {
      console.log("created: 挂载 了data", this.msg);
      setTimeout(() => {
        this.msg = "你好";
      }, 1000);
    },
    beforeMount() {
      console.log(
        "beforeMount: data没有渲染到了页面",
        document.getElementById("app").innerHTML
      );
    },

    mounted() {
      console.log(
        "mounted: data渲染到了页面",
        document.getElementById("app").innerHTML
      );
    },
    beforeUpdate() {
      console.log(
        "beforeUpdate: 数据更改导致DOM更改之前",
        document.getElementById("app").innerHTML
      );
    },
    updated() {
      console.log(
        "updated: 数据更改导致DOM更改之后",
        document.getElementById("app").innerHTML
      );
    },
    beforeDestroy() {
      console.log("beforeDestroy: ");
    },
    destroyed() {
      console.log("destroyed: ");
    },
  });

  document.getElementById("btn").onclick = () => {
    app.$destroy();
  };
</script>