vue生命周期

举报
林太白 发表于 2025/04/11 11:45:32 2025/04/11
【摘要】 vue生命周期

vue生命周期

Vue 2.x 的生命周期

生命周期

生命周期 描述
beforeCreate 组件实例被创建之初
created 组件实例已经完全创建
beforeMount 组件挂载之前
mounted 组件挂载到实例上去之后
beforeUpdate 组件数据发生变化,更新之前
updated 组件数据更新之后
beforeDestroy 组件实例销毁之前
destroyed 组件实例销毁之后
activated keep-alive 缓存的组件激活时
deactivated keep-alive 缓存的组件停用时
errorCaptured 捕获一个来自子孙组件的错误时
export default {
  data() {
    return { count: 0 };
  },
  beforeCreate() {
    console.log('beforeCreate');
  },
  created() {
    console.log('created');
  },
  beforeMount() {
    console.log('beforeMount');
  },
  mounted() {
    console.log('mounted');
  },
  beforeUpdate() {
    console.log('beforeUpdate');
  },
  updated() {
    console.log('updated');
  },
  beforeDestroy() {
    console.log('beforeDestroy');
  },
  destroyed() {
    console.log('destroyed');
  }
}

具体分析

阶段 描述
beforeCreate 初始化 Vue 实例,开始数据观测。
created 完成数据观测,属性与方法的运算,
watch 和事件回调的配置。
可调用 methods 中的方法,访问和修改 data 数据。此时 vm.$el 并未创建。
created -> beforeMount 判断是否存在 el 选项,若不存在则停止编译,直到调用 vm.$mount(el) 才会继续编译。
优先级:render > template > outerHTML。此时获取的是挂载 DOM 的元素。
beforeMount 在此阶段可以获取到 vm.el,但 vm.el 并未挂载到 el 选项对应的 DOM 元素上。
beforeMount -> mounted 此阶段 vm.el 已完成挂载,vm.$el 生成的 DOM 替换了 el 选项所对应的 DOM。
mounted vm.el 已完成 DOM 的挂载与渲染,打印 vm.$el 可以看到挂载点已被新的 DOM 替换。
beforeUpdate 更新的数据必须是被渲染在模板上的(eltemplaterender 之一)。此时 view 层还未更新。若在 beforeUpdate 中修改数据,不会再次触发更新方法。
updated 完成 view 层的更新。若在 updated 中修改数据,会再次触发更新方法(beforeUpdateupdated)。
beforeDestroy 实例被销毁前调用,实例的属性与方法仍可访问。
destroyed 完全销毁一个实例,清理它与其它实例的连接,解绑它的全部指令及事件监听器。并不能清除 DOM,仅销毁实例。

使用场景分析

生命周期 描述
beforeCreate 执行时组件实例还未创建,通常用于插件开发中执行一些初始化任务
created 组件初始化完毕,各种数据可以使用,常用于异步数据获取
beforeMount 未执行渲染、更新,dom未创建
mounted 初始化结束,dom已创建,可用于获取访问数据和dom元素
beforeUpdate 更新前,可用于获取更新前各种状态
updated 更新后,所有状态已是最新
beforeDestroy 销毁前,可用于一些定时器或订阅的取消
destroyed 组件已销毁,作用同上

数据请求在created和mouted的区别

created是在组件实例一旦创建完成的时候立刻调用,这时候页面dom节点并未生成;mounted是在页面dom节点渲染完毕之后就立刻执行的。触发时机上created是比mounted要更早的,两者的相同点:都能拿到实例对象的属性和方法。 讨论这个问题本质就是触发的时机,放在mounted中的请求有可能导致页面闪动(因为此时页面dom结构已经生成),但如果在页面加载前完成请求,则不会出现此情况。建议对页面内容的改动放在created生命周期当中。

Vue3.x的生命周期

import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue';

export default {
  setup() {
    onBeforeMount(() => {
      console.log('onBeforeMount');
    });
    onMounted(() => {
      console.log('onMounted');
    });
    onBeforeUpdate(() => {
      console.log('onBeforeUpdate');
    });
    onUpdated(() => {
      console.log('onUpdated');
    });
    onBeforeUnmount(() => {
      console.log('onBeforeUnmount');
    });
    onUnmounted(() => {
      console.log('onUnmounted');
    });
  }
}
生命周期钩子 作用 Vue 做了什么 常见用途
beforeCreate 在 Vue 实例创建之前调用 尚未初始化数据、事件、datacomputed 不常用,通常在这里不能访问任何数据或事件
created Vue 实例创建并初始化后调用,数据已初始化 初始化响应式数据,设置事件监听器,computedwatch 设置 初始化数据、执行异步操作或设置 API 调用等任务
beforeMount mounted 钩子之前调用,模板已编译但尚未挂载到 DOM Vue 即将挂载组件到 DOM,但尚未执行任何 DOM 更新 做挂载前的准备工作,如修改 DOM 或计算初始值
mounted 在组件挂载到 DOM 后调用 视图已渲染,mounted 钩子执行 适合操作 DOM,如获取元素、添加事件监听器、发起异步请求等
beforeUpdate 数据变化后,DOM 更新之前调用 数据变化,但视图尚未更新 执行在数据变化前的准备工作,如记录变化前的状态
updated 数据变化并导致 DOM 更新后调用 视图已更新,updated 钩子执行 操作更新后的 DOM,或与外部库进行交互,如更新图表等
beforeUnmount 组件销毁之前调用 组件即将销毁,但尚未从 DOM 中移除 清理任务,如取消订阅、移除事件监听器等
unmounted 组件销毁后调用,DOM 和子组件已被销毁 完全销毁组件,移除事件监听器,清理资源 销毁组件时的清理操作,如清除定时器、取消 HTTP 请求等

Vue3特有生命周期钩子(Composition API)

生命周期钩子 作用 Vue 做了什么 常见用途
setup() Vue 3 新增的生命周期钩子,位于实例创建之前执行 初始化响应式数据 (refreactive),返回 datacomputedmethods 等供模板使用 设置组件的响应式数据、方法、生命周期钩子、组合式逻辑等
onBeforeMount 在组件挂载之前调用,类似于 beforeMount 组件挂载前调用 setup 中使用,可以替代 beforeMount
onMounted 在组件挂载后调用,类似于 mounted 组件挂载完成后调用 setup 中使用,可以替代 mounted
onBeforeUpdate 数据更新前调用,类似于 beforeUpdate 数据变化前调用 setup 中使用,可以替代 beforeUpdate
onUpdated 数据更新后调用,类似于 updated 数据更新后调用 setup 中使用,可以替代 updated
onBeforeUnmount 在组件销毁前调用,类似于 beforeDestroy 组件即将销毁前调用 setup 中使用,可以替代 beforeDestroy
onUnmounted 在组件销毁后调用,类似于 destroyed 组件销毁后调用 setup 中使用,可以替代 destroyed
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。