初识vue-生命周期

前言

vue中生命周期该如何理解呢?就是某个组件从创建到销毁的几个阶段,在这个几个阶段你可以干什么,怎么干,都由开发者决定。vue提供了八个阶段的生命周期,虽然看似很多,但是一些基本不会用到,下面就看一下什么生命周期吧!

先看一下官方给的示例图(vue2):

初始化阶段

这个阶段有两个生命周期钩子,beforeCreate和created,在这个阶段做了哪些事呢?

在vue组件的生命周期中,beforeCreatedcreated阶段执行了一系列的操作:

  1. beforeCreated(创建前)阶段是Vue实例刚被创建出来,但是尚未完成初始化,此时实例上的属性、方法还未被创建和挂载。
  2. beforeCreated阶段中,可以进行一些初始化操作,比如全局事件的监听、获取初始化数据等。
  3. created(创建后)阶段,Vue实例的初始化已经完成,实例上的属性、方法已经被创建并且已经执行了数据观测(响应式),但是此时尚未挂载到DOM元素上。
  4. created阶段中,可以进行一些初始化数据的获取和处理、异步请求、组件的初始渲染等操作。
js 复制代码
<template>
  <div>
    <button>{{ name }}</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "",
    };
  },
  beforeCreate() {
    /* 在这里基本什么操作都做不了,因为vue实例还未挂载,但凡涉及到vue实例的操作都无法执行
    所以这个生命周期一般都不会用*/
    this.name = "iceCode"; //在这里赋值是没有任何效果的,也不会报错
  },
  created() {
    /* 在这就可以访问到vue实例上的响应数据,即data,props等一些响应数据 */
    this.name = "iceCode"; //在这里赋值 按钮的名字 为iceCode
  },
};
</script>

挂载阶段

这个阶段有两个生命周期钩子,beforeMount和mounted ,在这个阶段做了哪些事呢?

beforeMountmounted期间,当前组件进行了一系列的初始化操作和DOM挂载。具体来说,以下是该期间内发生的一些重要事件和操作:

  1. beforeMount阶段:

    • 组件实例已经初始化,可以访问各种数据,包括响应式数据和props等。
    • 可以使用各种Vue内置的指令,如v-if、v-for等。
    • 可以使用组件的实例方法,如methods中定义的方法。
  2. mounted阶段:

    • 组件的el已经被新创建的vm.$el替换,但是尚未插入到文档中。
    • 可以访问子组件,进行父子组件之间的通信等操作。
    • 可以对DOM进行操作,例如添加事件监听器、修改样式等。
    • 可以执行异步操作,如发送网络请求等。
js 复制代码
<template>
  <div>
    <button ref="button">{{ name }}</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "iceCode",
    };
  },
  beforeMount() {
    /* 这里是获取不到dom元素的,在这里dom操作是不会生效的
    跟在created里的效果类似,既然这样 大多情况下都会使用created不会使用这个中钩子
    */
    const { button } = this.$refs
    button.style.color='red'
   },
  mounted() {
    /* 在这里dom已经挂载好了,已经可以访问到dom元素了,所以在这里对dom进行操作是可以生效的 */
    const { button } = this.$refs
    button.style.color='red'//赋值之后 button里的字就成了红色
  }
};
</script>

更新阶段

这个阶段依旧有两个钩子,beforeUpdate和updated ,在这个阶段主要做了哪些?

在 Vue.js 中,beforeUpdateupdated 是 Vue 组件的生命周期钩子函数,它们在组件的更新过程中扮演着重要的角色。

  1. beforeUpdate:在组件的数据更新之前触发,发生在虚拟 DOM 重新渲染和打补丁(patch)之前。在这个生命周期钩子中,你可以执行一些准备工作,比如更新组件的状态、获取新的数据等。注意,在这个阶段,组件的 DOM 还未更新,因此无法访问更新后的 DOM。
  2. updated:在组件的数据更新之后触发,发生在虚拟 DOM 重新渲染和打补丁之后。在这个生命周期钩子中,你可以执行一些清理工作,比如移除不再需要的事件监听器、停止播放动画等。此外,在这个阶段,组件的 DOM 已经更新完成,你可以访问更新后的 DOM。
js 复制代码
<template>
  <div>
    <button ref="button" @click="btn">{{ name }}</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "iceCode",
    };
  },
  methods: {
    btn() {
      this.name = "new_iceCode";
      this.$refs.button.style.height = "60px";
    },
  },
  //在这个两个钩子里 所有的打印结果是一个样的,虽然说在beforeUpdate中dom还没更新
  //但是因为vue双向绑定的原理,数据驱动视图改变,当数据跟新的时候,dom也跟着同步跟新了
  //所以在这两个生命周期里的所打印的效果是相同的
  beforeUpdate() {
    const { button } = this.$refs;
    const h = getComputedStyle(button, null)["height"];
    console.log(button, h);
  },
  updated() {
    const { button } = this.$refs;
    const h = getComputedStyle(button, null)["height"];
    console.log(button, h);
  },
};
</script>

注意

beforeUpedate和updated这两个钩子中所有的打印结果是一个样的,虽然说在beforeUpdate中dom还没更新,但是因为vue双向绑定的原理,数据驱动视图改变,当数据更新的时候,dom也跟着同步更新了,所以在这两个生命周期里的所打印的效果是相同的

卸载阶段

这个阶段也有两个钩子,beforeDestory和destoryed ,这两个钩子中都做了什么 beforeDestroy和destroyed是Vue组件的生命周期钩子,它们在组件被销毁的阶段中分别执行不同的任务。

  1. beforeDestroy:这个钩子在Vue组件销毁之前被调用,也就是说在这个阶段,组件实例中所有的方法和数据都仍然处于可用状态。这个阶段适合进行一些清理工作,比如手动移除已经添加的事件监听器。
  2. destroyed:这个钩子在Vue组件销毁之后被调用,在这个阶段,组件中的所有方法和数据已经被完全销毁,实例已经不存在了。这个阶段可以用于执行一些后续的清理工作,比如清理实例连接,解绑它的全部指令及事件监听器。
js 复制代码
  beforeDestory() {
    //在这里可以进行自定义事件的清除,或者定时器的清除等工作
    //因为即使组件销毁的了,自定义的事件依旧存在,如果不及时清理,会造成内存泄漏
  },
  destoryed() {
    //在这里基本上什么都没有了,这个钩子很少用到
  }

当有父子组件时,生命周期的执行顺序

正常情况下,我们都知道生命周期的执行顺序是从上而下执行,那么当一个组件里包含着一个子组件的时候,那么他们的生命周期是怎么执行的呢

在组件创建和挂载阶段:

父组件的beforeCreatecreatedbeforeMount钩子函数会先执行,然后是子组件的beforeCreatecreatedbeforeMountmounted钩子函数,最后是父组件的mounted钩子函数。

在组件更新阶段: 父组件的beforeUpdate钩子函数会先执行,然后是子组件的beforeUpdate钩子函数。

子组件的updated钩子函数会执行,然后是父组件的updated钩子函数。

在组销毁阶段:

父组件的beforeDestroy钩子函数会先执行,然后是子组件的beforeDestroy钩子函数。

子组件的destroyed钩子函数会执行,然后是父组件的destroyed钩子函数。

结尾

生命周期钩子在vue中有着举足轻重的作用,Vue实例在创建、更新、销毁过程中分别会经历的一系列阶段,它对于了解Vue的工作机制至关重要。 Vue的生命周期允许我们更好地了解和控制Vue实例从创建到销毁的整个过程,可以在各个阶段进行相应的操作,更好地调试和改进代码。

相关推荐
老华带你飞15 小时前
建筑材料管理|基于springboot 建筑材料管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring
一招定胜负16 小时前
网络爬虫(第三部)
前端·javascript·爬虫
Shaneyxs16 小时前
从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(13)
前端
半山烟雨半山青16 小时前
微信内容emoji表情包编辑器 + vue3 + ts + WrchatEmogi Editor
前端·javascript·vue.js
码途潇潇16 小时前
Vue 事件机制全面解析:原生事件、自定义事件与 DOM 冒泡完全讲透
前端·javascript
zmirror16 小时前
Monorepo 在 Docker 中的构建方案方案
前端
用户479492835691516 小时前
node_modules 太胖?用 Node.js 原生功能给依赖做一次大扫除
前端·后端·node.js
_Kayo_16 小时前
TypeScript 学习笔记2
前端·javascript·typescript
海纳百川本尊7606416 小时前
Flutter框架核心原理深度解析
前端
Shaneyxs17 小时前
从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(12)
前端