什么是生命周期?

image.png

Vue 2.x

image.png
每个组件(每个),都有自己独立的生命周期,都会经历上图的所有过程

Vue 3.x

image.png
每个组件(每个),都有自己独立的生命周期,都会经历上图的所有过程

生命周期函数

image.png
就是Vue实例被创建后,从开始到结束,期间会依次执行一些函数,这些函数就是生命周期函数,也叫钩子函数。

各版本生命周期函数对比

Vue 2.x Vue 3.x 普通 Vue 3.x 组合API 说明
beforeCreate beforeCreate setup代替 组件创建前
created created setup代替 组件创建后
beforeMount beforeMount onBeforeMount 组件挂载DOM前
mounted mounted onMounted 组件挂载DOM后
beforeUpdate beforeUpdate onBeforeUpdate 组件因为响应式发生界面更新前
updated updated onUpdated 组件因为响应式发生界面更新后
beforeDestroy beforeUnmount onBeforeUnmount 组件即将被卸载
destroyed unmounted onUnmounted 组件被卸载

使用 (Vue 3.x)

  1. <template>
  2. <div>
  3. <h2 ref="title">{{message}}</h2>
  4. <button @click="changeMessage">修改message</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. message: "Hello Home"
  12. }
  13. },
  14. methods: {
  15. changeMessage() {
  16. this.message = "你好啊,李银河"
  17. }
  18. },
  19. beforeCreate() {
  20. console.log("home beforeCreate");
  21. },
  22. created() {
  23. console.log("home created");
  24. },
  25. beforeMount() {
  26. console.log("home beforeMount");
  27. },
  28. mounted() {
  29. console.log("home mounted");
  30. },
  31. beforeUnmount() {
  32. console.log("home beforeUnmount");
  33. },
  34. unmounted() {
  35. console.log("home unmounted");
  36. },
  37. beforeUpdate() {
  38. console.log(this.$refs.title.innerHTML);
  39. console.log("home beforeUpdate");
  40. },
  41. updated() {
  42. console.log(this.$refs.title.innerHTML);
  43. console.log("home updated");
  44. }
  45. }
  46. </script>
  47. <style scoped>
  48. </style>

image.png

使用 (Vue 3.x 组合API)

可以同时多个重复的生命周期,都会执行,方便抽取到外面

  1. <template>
  2. <div>
  3. <h2 ref="title">{{message}}</h2>
  4. <button @click="changeMessage">修改message</button>
  5. </div>
  6. </template>
  7. <script>
  8. import {
  9. onMounted,
  10. onBeforeMount,
  11. onBeforeUnmount,
  12. onUnmounted,
  13. onBeforeUpdate,
  14. ref,
  15. onUpdated
  16. } from "vue";
  17. export default {
  18. setup() {
  19. console.log("home beforeCreate");
  20. console.log("home created");
  21. let message = ref("Hello Home");
  22. const changeMessage = () => {
  23. message.value = "你好啊,李银河"";
  24. };
  25. onBeforeMount(() => {
  26. console.log("home beforeMount");
  27. });
  28. onMounted(() => {
  29. console.log("home mounted");
  30. });
  31. onMounted(() => {
  32. console.log("home mounted111"); // 可以同时多个重复的生命周期,都会执行,方便抽取到外面
  33. });
  34. onBeforeUnmount(() => {
  35. console.log("home beforeUnmount");
  36. });
  37. onUnmounted(() => {
  38. console.log("home unmounted");
  39. });
  40. onBeforeUpdate(() => {
  41. console.log("message", message.value);
  42. console.log("home beforeUpdate");
  43. });
  44. onUpdated(() => {
  45. console.log("message", message.value);
  46. console.log("home updated");
  47. });
  48. return {
  49. message,
  50. changeMessage
  51. };
  52. }
  53. };
  54. </script>
  55. <style scoped>
  56. </style>

keep-alive 的生命周期

keep-alive 可以查看 https://www.yuque.com/yejielin/mypn47/fq2mh6#AVvUm
image.png
也就是,被keep-alive标签包裹的组件,我们需要缓存的,额外多了2个生命周期,分别是 活跃(激活中)和 不活跃(隐藏的)