了解 Vue 生命周期钩子

简介: 和其他框架一样,Vue 有许多生命周期钩子,它们允许将代码附加到在创建或使用 Vue 应用程序时发生的特定事件,如当组件加载时、当组件被添加到 DOM 时或者当某些东西被删除时。

和其他框架一样,Vue 有许多生命周期钩子,它们允许将代码附加到在创建或使用 Vue 应用程序时发生的特定事件,如当组件加载时、当组件被添加到 DOM 时或者当某些东西被删除时。

Vue 有很多生命周期钩子,令人困惑的是每个钩子的含义或作用。在本指南中,将介绍每个生命周期挂钩的作用以及如何使用它们。

生命周期钩子

Vue 在生命周期钩子方面有两种范式。一种是 Vue3 中引入的组合式API(Composition API),另一种是Vue2 中选项式API(Options API) ,它是定义 Vue 组件的原型模式。在本指南中,将从选项式API(Options API)开始,然后以此为基础来展示组合式API(Composition API)中的工作原理。

选项式API(Options API)

选项式API(Options API)是 Vue2 的范式,如下代码所示:

export default {
    name: "DevPoint",
    data() {
        return {
            phoneNumber: "13566666666",
        };
    },
    mounted() {},
};

生命周期流程图

要了解每个生命周期挂钩何时触发,下图描述了每个生命周期挂钩何时触发。

image.png

运行生命周期挂钩

要使用选项式API(Options API)运行任何生命周期挂钩,可以将其添加到 Javascript 原型中。例如,如果使用 beforeCreate(),在检测到新组件后触发的第一个钩子,可以像这样添加它:

export default {
    name: "DevPoint",
    data() {
        return {
            someData: "20220609",
        };
    },
    mounted() {},
};

上面已经展示了不同钩子发生的时机,接下来介绍各个钩子各自做了什么,具体什么情况下触发。

beforeCreate()

在组件初始化时调用,data()computed 属性此时不可用。它对于调用不操作组件数据的 API 非常有用。如果 data() 在这个钩子里面更新,一旦选项式API(Options API)加载完,更新将会将会丢失,变得无效。

created()

在实例处理完所有状态操作后调用,可以访问响应式数据、computed 属性、methodswatch$el 是 Vue 存储组件 HTML 的变量,在这个钩子中还不可用,因为此时还没有创建 DOM 元素。如果需要触发 API 等不操作DOM元素的操作或者更新 data()则可以在这里进行。

beforeMount()

这个钩子在渲染发生之前会被执行。模板已编译,因此它存储在内存中,但尚未附加到页面,尚未创建任何 DOM 元素,因此 $el 在这个阶段仍然不可用。

mounted()

组件已安装并显示在页面上, $el 可被正常使用,在此阶段可以从 Vue 访问和操作 DOM。这只会在所有子组件完全安装后触发。当想在 DOM 加载后对其执行某些操作时,使用它很有用,比如可能更改其中的特定元素。

beforeUpdate()

有时,会通过在watch 中更新数据或通过用户交互来更改 Vue 组件中的数据。当更改 data() 或导致组件重新渲染时,将触发更新事件。在DOM重新渲染发生之前,beforeUpdate() 将立即触发。在此事件之后,组件将重新渲染并使用最新数据进行更新。可以使用这个钩子来访问 DOM 的当前状态,甚至可以更新 data()

updated()

触发更新后,并且 DOM 已更新以最新数据重新渲染后,updated() 将触发。这是在重新渲染后立即发生。现在,如果访问$el DOM 内容或其他任何有关 DOM 内容的内容,它将显示新的、重新渲染后的版本。如果有父组件,updated() 则首先调用子组件,然后调用父 updated() 挂钩。

beforeUnmount()

如果一个组件被移除,那么它就会被卸载。在组件被完全移除之前,beforeUnmount() 触发。此事件仍然可以访问 DOM 元素以及与组件有关的任何其他内容。这在删除事件中很有用,例如,可以使用此事件通知服务器用户已删除表中的节点。如果需要使用它们,仍然可以访问 this.$el,以及 data()methodswatch

unmount()

一旦完全删除,unmount() 事件就会触发。这可用于清理其他数据或事件侦听器或定时器,以让知道该组件不再存在于页面上。如果需要使用它们,仍然可以访问访问 this.$el,以及 data()methodswatch

组合式API(Composition API)中的生命周期钩子

如果习惯使用选项式API(Options API),上面的钩子会很有意义。如果主要使用 Vue 3,则需要习惯使用组合式API(Composition API)的风格。组合式API(Composition API)是 选项式API(Options API) 的补充,但使用钩子的方式略有不同。

setup() 替换 created() 和 beforeCreated()

在组合式API(Composition API)中,created()beforeCreated() 不可访问。被替换为 setup()  ,在 created()beforeCreated()  实现的逻辑完全可以迁移到 setup()  中。

钩子可以与 setup() 一起使用

Hooks 可以与 setup() 一起使用,如下:

export default {
    name: "DevPoint",
    data() {
        return {
            someData: "20220609",
        };
    },
    setup() {
        console.log("setup");
    },
    mounted() {
        console.log(this.$el);
    },
};

但是,可能会看到这样做的另一种方式是使用组合式 API 函数在 setup() 函数中定义挂钩,如果需要这样做,钩子的命名会略有不同:

  • beforeMount() 改为 onBeforeMount()
  • mounted() 改为 onMounted()
  • beforeUpdate() 改为 onBeforeUpdate()
  • updated() 改为 onUpdated()
  • beforeUnmount() 改为 onBeforeUnmount()
  • unmounted() 改为 onUnmounted()

这些函数的作用与前面介绍描述的完全相同,但调用方式略有不同。所有这些钩子都必须在 setup() 函数或设置脚本中调用。例如,必须在 setup 函数中运行钩子,如下所示:

export default {
    setup() {
        // 所有钩子的逻辑代码在这里
    },
};

或者如下:

<script setup>
// 所有钩子的逻辑代码在这里
</script>

因此,如果想使用这种方法调用钩子,大概代码如下:

<script>
export default {
    setup() {
        // 所有钩子逻辑
        onBeforeMount(() => {
            //  beforeMount() 逻辑
        });
        onBeforeUpdate(() => {
            // beforeUpdate() 逻辑
        });
    },
};
</script>

总结

Vue 生命周期相当复杂,但它为前端开发提供了很多工具来运行代码、更新数据并确保组件以想要的方式显示。


相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
29天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
29天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
23 1
|
25天前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
27 1
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
25天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
下一篇
DataWorks