《Vue.js 生命周期全解析:从创建到销毁的每一步》

举报
跟着小郑学前端 发表于 2024/12/09 17:47:05 2024/12/09
【摘要】 Vue.js 生命周期包括创建、更新和销毁三个阶段,每个阶段提供了不同的钩子函数,如 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy 和 destroyed,允许开发者在特定时机执行自定义逻辑。掌握这些钩子的触发时机,有助于优化应用的性能和可维护性。

《Vue.js 生命周期全解析:从创建到销毁的每一步》

在这里插入图片描述

1. Vue 生命周期概述

Vue 生命周期可以分为以下几个阶段:

  • 创建阶段:Vue 实例被创建和挂载到 DOM 上的过程。
  • 更新阶段:当数据变化时,Vue 实例会重新渲染,更新视图。
  • 销毁阶段:当 Vue 实例被销毁时,会进行资源清理。
  • 每个阶段中,Vue 都提供了一些钩子函数,允许开发者在这些阶段执行自定义逻辑。

2. 生命周期钩子函数

生命周期钩子函数图示

在 Vue 实例的生命周期中,钩子函数的调用顺序如下图所示:

rust
beforeCreate -> created -> beforeMount -> mounted
     |              |                 |
  Data初始化    组件实例化    DOM挂载完毕    更新数据...

钩子函数的详细解释

以下是 Vue 实例生命周期的主要钩子函数及其描述:

生命周期钩子 触发时机 使用场景
beforeCreate 在实例创建之后,数据观测和事件/生命周期设置之前触发 通常不在此钩子中进行操作,因数据不可用
created 在实例创建后,数据观测、事件/生命周期已设置完成之后触发 在此钩子中,可以访问数据、事件、计算属性等
beforeMount 在挂载开始之前触发,相关的 render 函数首次被调用 可以用来进行初始化操作或改变 props 值
mounted 在 DOM 挂载完成后触发,视图已渲染,$el 可以访问到 可用于执行 DOM 操作或发起 HTTP 请求
beforeUpdate 当数据更新时,视图重新渲染之前触发 可用于操作即将更新的 DOM,进行一些清理工作
updated 在数据更新并且视图重新渲染后触发 可用于进行后续操作,例如与第三方库交互
beforeDestroy 在实例销毁之前触发 可以用于清理定时器、取消订阅等操作
destroyed 实例销毁后触发 用于清理资源或执行销毁后的操作,如移除事件监听器等

3. 各生命周期钩子的代码示例

beforeCreate

beforeCreate 钩子在 Vue 实例初始化时调用,此时无法访问到数据、计算属性、事件等。

new Vue({
  beforeCreate() {
    console.log('beforeCreate: 实例创建之前');
  },
  data() {
    return {
      message: 'Hello Vue!'
    };
  }
});

created

created 钩子在实例被创建后、数据观测和事件/生命周期设置完成之后被调用,此时可以访问到数据、计算属性、事件等。

new Vue({
  created() {
    console.log('created: 实例创建完成,数据可用');
    console.log(this.message); // 'Hello Vue!'
  },
  data() {
    return {
      message: 'Hello Vue!'
    };
  }
});

beforeMount

beforeMount 钩子在挂载开始之前被调用,这时候模板已经编译好,但尚未插入到 DOM。

new Vue({
  beforeMount() {
    console.log('beforeMount: 模板挂载之前');
  },
  mounted() {
    console.log('mounted: DOM 已挂载');
  },
  data() {
    return {
      message: 'Hello Vue!'
    };
  }
});

mounted

mounted 钩子在 DOM 挂载完成之后调用,可以在此处执行一些需要 DOM 交互的操作,如设置定时器或访问 DOM 元素。

new Vue({
  mounted() {
    console.log('mounted: DOM 挂载完成');
    document.getElementById('app').style.color = 'red';
  },
  data() {
    return {
      message: 'Hello Vue!'
    };
  }
});

beforeUpdate

beforeUpdate 钩子在数据变化并且视图重新渲染之前调用,可以在此时进行一些准备工作。

new Vue({
  data() {
    return {
      message: 'Hello Vue!'
    };
  },
  beforeUpdate() {
    console.log('beforeUpdate: 数据更新前');
  },
  updated() {
    console.log('updated: 数据更新后');
  }
});

updated

updated 钩子在数据更新并且 DOM 更新后调用。这个钩子常用于更新第三方库,或者进行一些渲染后的操作。

new Vue({
  data() {
    return {
      message: 'Hello Vue!'
    };
  },
  updated() {
    console.log('updated: 数据更新后');
  }
});

beforeDestroy

beforeDestroy 钩子在 Vue 实例销毁之前调用,适合进行资源清理工作,如清除定时器、移除事件监听器等。

new Vue({
  beforeDestroy() {
    console.log('beforeDestroy: 实例销毁前');
  },
  destroyed() {
    console.log('destroyed: 实例销毁后');
  }
});

4. 生命周期钩子总结

生命周期钩子 描述 触发时机
beforeCreate 实例创建前,无法访问数据和事件 在实例初始化时触发
created 实例创建后,数据可访问,事件、生命周期已设置 实例已创建,数据初始化完成之后
beforeMount 在挂载开始前,render 函数首次被调用 组件实例化后但 DOM 尚未挂载前
mounted DOM 挂载完成后 DOM 完全挂载,组件显示到页面上
beforeUpdate 数据更新后,DOM 更新前 数据发生变化之前,视图未重新渲染
updated 数据更新并且视图重新渲染后 数据更新并重新渲染之后
beforeDestroy 实例销毁前 用于清理工作(例如移除事件监听器)
destroyed 实例销毁后 实例销毁之后,适合做销毁后的清理工作,例如移除定时器、事件监听等

5. 总结

Vue 的生命周期钩子函数提供了丰富的操作点,允许开发者在不同的阶段插入自定义逻辑。理解生命周期钩子的触发顺序和适用场景,有助于编写高效、可维护的 Vue 应用。通过本文对 Vue 生命周期的讲解,相信你对 Vue 实例的创建、更新和销毁过程有了更清晰的了解。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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