vue3之生命周期钩子

ops/2024/10/18 19:15:17/

Vue 组件实例生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。
在这里插入图片描述

调用生命周期钩子API 都应该在组件的 setup() 阶段被同步调用。

这并不意味着对生命周期钩子API 的调用必须放在 setup() 或 <script setup> 内的词法上下文中。也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自 setup() 就可以。

生命周期钩子概述

在 Vue 3 中,组合式 API 提供了一系列的生命周期钩子函数,这些函数可以在组件的不同生命周期阶段执行特定的逻辑。

  1. onBeforeMount:在组件挂载到 DOM 之前调用。
  2. onMounted:在组件挂载到 DOM 之后调用。
  3. onBeforeUpdate:在组件更新之前调用。
  4. onUpdated:在组件更新之后调用。
  5. onBeforeUnmount:在组件卸载之前调用。
  6. onUnmounted:在组件卸载之后调用。

生命周期钩子的使用

1. onBeforeMount

onBeforeMount 钩子在组件挂载到 DOM 之前调用。可以在这个钩子中执行一些初始化逻辑,但此时 DOM 还没有被渲染。

javascript"><script setup>
import { onBeforeMount } from 'vue';onBeforeMount(() => {console.log('Component is about to be mounted');
});
</script>
2. onMounted

onMounted 钩子在组件挂载到 DOM 之后调用。此时,DOM 已经被渲染,可以在这个钩子中执行与 DOM 相关的操作,例如获取 DOM 元素、添加事件监听等。

javascript"><script setup>
import { onMounted } from 'vue';onMounted(() => {console.log('Component has been mounted');const element = document.getElementById('my-element');console.log(element);
});
</script>
3. onBeforeUpdate

onBeforeUpdate 钩子在组件更新之前调用。可以在这个钩子中执行一些准备工作,例如保存当前状态,以便在更新后进行比较。

javascript"><script setup>
import { onBeforeUpdate } from 'vue';onBeforeUpdate(() => {console.log('Component is about to be updated');
});
</script>
4. onUpdated

onUpdated 钩子在组件更新之后调用。此时,DOM 已经被更新,可以在这个钩子中执行与更新后的 DOM 相关的操作。

javascript"><script setup>
import { onUpdated } from 'vue';onUpdated(() => {console.log('Component has been updated');
});
</script>
5. onBeforeUnmount

onBeforeUnmount 钩子在组件卸载之前调用。可以在这个钩子中执行一些清理工作,例如移除事件监听、取消订阅等。

javascript"><script setup>
import { onBeforeUnmount } from 'vue';onBeforeUnmount(() => {console.log('Component is about to be unmounted');
});
</script>
6. onUnmounted

onUnmounted 钩子在组件卸载之后调用。此时,组件已经从 DOM 中移除,可以在这个钩子中执行一些最终的清理工作。

javascript"><script setup>
import { onUnmounted } from 'vue';onUnmounted(() => {console.log('Component has been unmounted');
});
</script>

示例

以下是一个综合示例,展示了如何在一个组件中使用多个生命周期钩子:

javascript"><template><div><p>{{ message }}</p><button @click="updateMessage">Update Message</button></div><div><button @click="toggleComponent">Toggle Component</button><component :is="currentComponent" /></div>
</template><script setup>
import { shallowRef, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue';
import ComponentA from './components/ComponentA.vue';
import ComponentB from './components/ComponentB.vue';const currentComponent = shallowRef(ComponentA);const toggleComponent = () => {currentComponent.value = currentComponent.value === ComponentA ? ComponentB : ComponentA;
};const message = shallowRef('Hello, World!');const updateMessage = () => {message.value = 'Hello, Vue 3!';
};// 在组件挂载之前调用
onBeforeMount(() => {console.log('Component is about to be mounted');
});// 在组件挂载之后调用
onMounted(() => {console.log('Component has been mounted');
});// 在组件更新之前调用
onBeforeUpdate(() => {console.log('Component is about to be updated');
});// 在组件更新之后调用
onUpdated(() => {console.log('Component has been updated');
});// 在组件卸载之前调用
onBeforeUnmount(() => {console.log('Component is about to be unmounted');
});// 在组件卸载之后调用
onUnmounted(() => {console.log('Component has been unmounted');
});
</script><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}
.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

ComponentA.vue

javascript"><template><div><p>Component A</p></div>
</template><script setup>
import { onBeforeUnmount, onUnmounted } from 'vue';onBeforeUnmount(() => {console.log('Component A is about to be unmounted');
});onUnmounted(() => {console.log('Component A has been unmounted');
});
</script>

ComponentB.vue

javascript"><template><div><p>Component B</p></div>
</template><script setup>
import { onBeforeUnmount, onUnmounted } from 'vue';onBeforeUnmount(() => {console.log('Component B is about to be unmounted');
});onUnmounted(() => {console.log('Component B has been unmounted');
});
</script>

初始状态下,ComponentA 被渲染。
点击按钮切换到 ComponentB,此时 ComponentA 将被卸载,触发 onBeforeUnmountonUnmounted 钩子。
再次点击按钮切换回 ComponentA,此时 ComponentB 将被卸载,触发 onBeforeUnmountonUnmounted 钩子。


http://www.ppmy.cn/ops/126542.html

相关文章

机器学习_线性回归_线性回归过拟合和欠拟合+正则化线性模型学习总结

线性回归的缺陷--欠拟合和过拟合 欠拟合: 简介 训练集和测试集表现都不怎么样, 模型太简单 产生原因: 学习到的特征太少 改进方法: 1.添加其他特征 组合 泛化 相关性 上下文特征,平台特征等 2.添加多项式特征, 将低次项模型变成高次项模型 过拟合: 简介 原始特征过多,存在嘈杂特…

【python】数据容器:dict(字典、映射)

目录 数据容器入门数据容器&#xff1a;list&#xff08;列表&#xff09;list&#xff08;列表&#xff09;的遍历数据容器&#xff1a;tuple&#xff08;元组&#xff09;数据容器&#xff1a;str&#xff08;字符串&#xff09;数据容器的切片数据容器&#xff1a;set&…

G-Set(增长集合,Grow-Only Set)

一、概念 G-Set&#xff08;增长集合&#xff0c;Grow-Only Set&#xff09;是一种冲突自由复制数据类型&#xff08;Conflict-Free Replicated Data Type, CRDT&#xff09;&#xff0c;用于在分布式系统中同步和合并数据&#xff0c;而不需要中央协调器。G-Set 支持两种操作…

LLM - 使用 Neo4j 可视化 GraphRAG 构建的 知识图谱(KG) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142938982 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Neo4j …

深入了解React 工作原理是什么

前端面试题包括ECMScript,TypeScript,Nodejs,React,Webgl,Webpack,Threejs等还在整理中&#xff0c;在线地址前端面试题&#xff0c;源码地址大家多多支持才有动力给大家分享更多好的面试题。 React 的工作原理基于以下几个关键概念&#xff1a;虚拟 DOM&#xff08;Virtual D…

@PostConstruct和afterPropertiesSet方法执行多次的原因

近日&#xff0c;遇到一个问题&#xff0c;PostConstruct方法会莫名执行多次&#xff0c;单看代码看不出问题&#xff0c;印象中也只会在bean初始化的时候执行一次而已。 然后问AI&#xff0c;问百度&#xff0c;没找到原因。 后面自己猜测&#xff08;现在都是面向猜测编程&am…

大数据治理:定义、重要性及实践

大数据治理&#xff1a;定义、重要性及实践 引言 大数据治理是当代企业信息管理和数据管理的重要环节&#xff0c;它涉及到数据的获取、处理、存储、安全、质量、生命周期管理等方方面面。随着信息技术的迅猛发展和数据量的爆炸式增长&#xff0c;大数据治理已经成为企业提升…

Vue 3 中的状态管理:深入探讨 Vuex 和 Pinia 的比较与最佳实践

文章目录 1. 引言2. Vuex 的使用及其状态管理模型2.1 Vuex 的核心概念2.2 Vuex 的优点与局限性 3. Pinia 的特点及与 Vuex 的比较3.1 Pinia 的核心特点3.2 Pinia 与 Vuex 的主要区别 4. 如何在 Vue 3 中实现状态管理的最佳实践4.1 小型应用中的最佳实践4.2 大型应用中的最佳实践…