vue生命周期浅析,让你的前端开发如虎添翼

前言

vue 是一款流行的前端框架,而生命周期则是 vue 的核心之一。在本文中,我将带大家深入了解 vue 中的生命周期,探究其实现原理及应用场景,让你更好地掌握 vue 的开发技巧。

在这里插入图片描述


生命周期钩子函数

通俗来讲,其实 vue 的生命周期就是实例从创建到销毁的过程。开始创建、初始化数据、编译模板、挂载 dom、渲染、更新、销毁等一系列过程,称之为 vue 的生命周期。而钩子函数可以说是 vue 生命周期中每个阶段对外开放让开发者操作 vue 的一些方法实例。


1. beforeCreate 组件实例创建前

beforeCreate 钩子函数中,vue 实列还没有挂载完成,此时的 this 是获取不到的,$el 还不可用,data 中的数据也是获取不到的,页面中的真实 dom 节点也没有挂载出来。

<template>
  <div></div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  beforeCreate() {
    console.log(this.msg); // undefined
    console.log(this.$el); // undefined
  },
};
</script>

2. created 组件实例创建后

created 钩子函数中,vue 实例中的 datamethod 已被初始化,属性也被绑定,但是此时还是虚拟 dom,真实 dom 还没生成,$el 还不可用。但是可以调用 datamethod 的数据及方法,created 钩子函数也是最早可以调用 datamethod 的。

<template>
  <div></div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  created() {
    console.log(this.msg); // data数据
    console.log(this.$el); // undefined
  },
};
</script>

3. beforeMount 渲染dom前

beforeMount 钩子函数中,模板已经编译完成,但还没有被渲染至页面中,可以获取 thisdata 中的数据,即将可以获取到真实的 dom

<template>
  <div></div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  beforeMount() {
    console.log(this.msg); // data数据
    console.log(this.$el); // undefined
  },
};
</script>

4. mounted 渲染dom后

mounted 钩子函数中,模板已经被渲染成真实 dom,用户已经可以看到渲染完成的页面,页面的数据也是通过双向绑定显示 data 中的数据,数据挂载完毕。

<template>
  <div class="box"></div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  mounted() {
    console.log(this.msg); // data数据
    console.log(this.$el); // <div data-v-7ba5bd90 class="box"></div>
  },
};
</script>

小结1

至此,创建 vue 实例完成。

<template>
  <div class="box"></div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  // 组件实例创建前
  beforeCreate() {
    console.log(this.msg); // undefined
    console.log(this.$el); // undefined
  },
  // 组件实例创建后
  created() {
    console.log(this.msg); // data数据
    console.log(this.$el); // undefined
  },
  // 挂载dom前
  beforeMount() {
    console.log(this.msg); // data数据
    console.log(this.$el); // undefined
  },
  // 挂载dom后
  mounted() {
    console.log(this.msg); // data数据
    console.log(this.$el); // <div data-v-7ba5bd90 class="box"></div>
  },
};
</script>

控制台打印结果

在这里插入图片描述


5. beforeUpdate 数据更新前

beforeUpdate 钩子函数中,是更新前的状态,但是是 view 层的数据变化前,不是 data 中的数据改变前,重新渲染之前触发,然后 vue 的虚拟 dom 机制会重新构建虚拟 dom 与上一次的虚拟 dom 树利用 diff 算法进行对比之后重新渲染。beforeUpdate 并不会主动调用,在 dom 挂载完成后,只有在数据更新时,监听到数据的变化才会执行,但在次钩子函数中,获取到的数据是数据更行之前的数据。

<template>
  <div class="box">{{num}}</div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
      num: 0,
    };
  },
  mounted() {
    this.num++;
  },
  beforeUpdate() {
    console.log(this.$el); // <div data-v-7ba5bd90 class="box">1</div>
    console.log(this.$data); // {msg: "data数据",num:0}
  },
};
</script>

6. updated 数据更新后

updata 钩子函数中,数据已经更改完成,且生成新的虚拟 dom,与上一次的虚拟 dom 结构进行对比,比较出来差异(diff算法),再去进行真实 dom 的重新渲染操作。updated 中真实 dom 里面显示的数据跟内存中 data 里面的数据趋于一致。

<template>
  <div class="box">
    <button @click="dotOn">点击我</button>
    <div>{{msg}}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  methods: {
    dotOn() {
      this.msg = "更新数据!!!";
    },
  },
  updated() {
    console.log(this.$el);
    console.log(this.msg);
  },
};
</script>

控制台打印结果

在这里插入图片描述


7. beforeDestroy 组件实例销毁前

beforeDestroy 钩子函数中,是组件销毁前执行,会触发执行 vm.$destroy() 方法,然后组件被销毁。

<template>
  <div class="box">
    <router-link to="./b"><button>点击离开该页面</button></router-link>
    <div>{{msg}}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "data数据",
    };
  },
  beforeDestroy() {
    this.msg = "离开之前更新数据!!!";
    console.log(this.msg);
  },
};
</script>

控制台打印结果

在这里插入图片描述


8. destroyed 组件实例销毁后

destroyed 钩子函数中,组件销毁完成。dom 仍然元素存在,只是不再受 vue 控制,卸载 watcher,事件监听,子组件。

<template>
  <div class="box">
    <router-link to="./b"><button>点击离开该页面</button></router-link>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  mounted() {
    let loginForm = {
      userNmae: "sds",
      password: "123",
    };
    sessionStorage.setItem("userKey", JSON.stringify(loginForm));
  },
  destroyed() {
    window.sessionStorage.removeItem("userKey");
  },
};
</script>

控制台打印结果

在这里插入图片描述


小结2

以上就是 vue 中最常见的生命周期了,当然,除此之外,vue 还有下面 3 个特殊的生命周期。


9. activated 活跃状态

activated 钩子函数中,组件激活时调用。需要配合 keep-alive 来进行使用。


10. deactivated 缓存状态

deactivated 钩子函数中,组件停用的时候调用。需要配合 keep-alive 来进行使用。


11. errorCaptured 捕捉子/孙组件错误时调用

errorCaptured 钩子函数中,当捕获一个来自子/孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。


各个钩子函数的使用场景

beforeCreate

beforeCreate 可以完成一些初始化的工作。例如可以在此加一些 loading 效果,在 created 时进行移除。

created

created 一般在这里就可以发送一些网络请求获取数据了。

beforeMounted

beforeMounted 可以访问数据,也可以更改数据。

mounted

mounted 挂载元素,获取 dom 节点等;

beforeUpdate

beforeUpdate 适合在更新之前访问现有的 dom,例如手动移除已添加的事件监听器。

updated

updated 任何数据的更新,如果对数据统一处理,在这里写上相应的函数。

beforeDestroy

beforeDestroy 可以在此清除计时器、清除非指令绑定的事件等。

destroyed

destroyed 组件销毁加一些轻提示之类的。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值