【Vue-Day12】Vue组件的生命周期

目录

一.什么是生命周期?

二.Vue2生命周期

[1.1 创建阶段(Create)](#1.1 创建阶段(Create))

beforeCreate,组件实例刚创建。

created,组件实例创建完成。

[1.2 挂载阶段(Mount)](#1.2 挂载阶段(Mount))

beforeMount,组件挂载前。

mounted,组件挂载到实例上去之后。

[1.3 更新阶段(Update)](#1.3 更新阶段(Update))

beforeUpdate,组件数据发生变化,数据更新前。

updated,数据更新之后。

1.4销毁阶段(Destroy)

beforeDestroy,组件实例销毁之前。

destroyed,组件实例销毁之后。

三.Vue3生命周期

四.常用的生命周期

五.父子组件生命周期执行顺序


一.什么是生命周期?

生命周期就是Vue 组件创建 → 挂载 → 更新 → 销毁 的整个过程。即指从组件创建,初始化数据,编译模板,挂载DOM,渲染更新,渲染卸载等一系列过程。

在此过程中,Vue会在合适的时机,调用特定的函数,从而让开发者有机会在特定阶段运行自己的代码,这些特定的函数统称为:生命周期钩子。

我们可以在这些钩子中写业务逻辑(请求数据、操作 DOM、清理定时器等)。


二.Vue2生命周期

Vue2生命周期可以分成4个阶段:

创建 - 挂载 - 更新 - 销毁

每个阶段都有两个钩子,一前一后,一共八个生命周期钩子。

Vue2生命周期钩子:

  • 创建前,创建完毕(beforeCreate,created
  • 挂载前,挂载完毕(beforeMount,mounted
  • 更新前,更新完毕(beforeUpdate,updated
  • 销毁前,销毁完毕(beforeDestroy,destroyed

1.1 创建阶段(Create)

beforeCreate,组件实例刚创建。

特点:

  • data、methods 都还没有初始化

  • 不能访问 this.data

    TypeScript 复制代码
    beforeCreate() {
      console.log('beforeCreate')
    }

created,组件实例创建完成。

此时可以访问 data、methods,可以请求接口,初始化数据。

但不能访问 DOM

TypeScript 复制代码
created() {
  console.log(this.data)
}

1.2 挂载阶段(Mount)

beforeMount,组件挂载前。

模板编译完成,但还没渲染到页面DOM还没有挂载到页面,拿不到真实DOM。

TypeScript 复制代码
beforeMount() {
  console.log('beforeMount')
}

mounted,组件挂载到实例上去之后。

DOM渲染完成。可以操作 DOM,获取元素,启动定时器。

TypeScript 复制代码
mounted() {
  console.log(document.querySelector('#app'))
}

1.3 更新阶段(Update)

响应式数据改变 时触发。

beforeUpdate,组件数据发生变化,数据更新前。

数据是新的,但页面时旧的,DOM还未更新完成。

TypeScript 复制代码
beforeUpdate() {
  console.log('beforeUpdate')
}

updated,数据更新之后。

DOM更新完成。页面和数据保持同步。

TypeScript 复制代码
updated() {
  console.log('updated')
}

1.4销毁阶段(Destroy)

beforeDestroy,组件实例销毁之前。

此时实例还可用,可以清除定时器,取消事件监听,解绑事件。

TypeScript 复制代码
beforeDestroy() {
  clearInterval(this.timer)
}

destroyed,组件实例销毁之后。

此时所有的数据,方法,指令都不可用。

TypeScript 复制代码
destroyed() {
  console.log('destroyed')
}

v-if 和 v-show 的区别:

共同点:都是控制DOM元素在页面中是否显示,用法也相同,表达式为true时,都会占据页面位置。表达式都为false时,都不会占据页面位置。

区别:

  • v-if是真正的条件渲染,他会将dom元素整个添加或删除,确保条件块内的监听事件和子组件适当的被销毁和重建。
  • v-show只是控制元素的css属性,为其设置display为none,但DOM元素依旧存在,他只是简单的基于css切换。
  • v-if有更高的切换消耗,v-show有更高的初始渲染消耗。

使用场景:

  • v-show:如果需要非常频繁的切换,使用v-show
  • v-if:如果运行时条件很少改变,使用v-if

三.Vue3生命周期

  1. Vue3 生命周期和 Vue2 基本一致,但名字变化了 。(所有的生命周期钩子前面都加一个on).
  2. Vue3取消了创建阶段的两个钩子( beforeCreate,created**)**,并用setup代替这个阶段。
  3. Vue3不再使用destory,改为unmount
  4. 使用钩子函数时需要从 vue 中导入函数使用
TypeScript 复制代码
import { onBeforeUpdate } from 'vue'

onBeforeUpdate(() => {
  console.log('beforeUpdate')
})

Vue3的生命周期钩子:

  • 创建阶段:setup
  • 挂载阶段:onBeforeMount,onMounted
  • 更新阶段:onBeforeUpdate,onUpdated
  • 卸载阶段:onBeforeUnmount,onUnmounted
TypeScript 复制代码
<script setup lang="ts">
import { onMounted, onUpdated, onBeforeUnmount } from 'vue'

onMounted(() => {
  console.log('组件挂载完成')
})

onUpdated(() => {
  console.log('组件更新')
})

onBeforeUnmount(() => {
  console.log('组件即将卸载')
})
</script>

四.常用的生命周期

生命周期 用途
setup 初始化数据
onMounted 请求接口 / DOM操作
onUpdated 数据更新后的处理
onBeforeUnmount 清理定时器 / 事件

五.父子组件生命周期执行顺序

先说结论:父组件先创建,子组件先挂载,父组件在子组件挂载完毕之后才挂载自己。

整体流程:

  • 父 beforeCreate :父组件开始创建
  • 父 created :父组件实例被创建,数据初始化
  • 父 beforeMount :父组件开始挂载,此时Vue发现模板里有子组件,于是开始创建子组件
  • 子 beforeCreate :子组件开始创建
  • 子 created
  • 子 beforeMount
  • 子 mounted :子组件挂载完成,子组件DOM创建完毕
  • 父 mounted :父组件DOM生成

注意:

父组件必须等子组件DOM渲染完成才能算正真挂载完成,所以mounted必须是子组件先执行

相关推荐
橙子家1 小时前
浏览器缓存之【身份与会话管理】:Cookies 和 Private state tokens
前端
To_OC2 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
最新资讯动态2 小时前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态2 小时前
游戏出海,从产品走向体系
前端
最新资讯动态2 小时前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态2 小时前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝4 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen4 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒5 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
山河木马6 小时前
矩阵专题0-webGL中的矩阵
javascript·webgl·计算机图形学