Vue 3 入門教程5 - 生命周期鉤子

一、生命周期概述

Vue 組件從創建到銷毀的整個過程稱為生命周期,在這個過程中,Vue 會自動觸發一系列的函數,這些函數被稱為生命周期鉤子。通過生命周期鉤子,我們可以在組件的不同階段執行特定的操作,例如初始化數據、發送請求、操作 DOM 等。

Vue 3 的生命周期鉤子與 Vue 2 相比,在命名和使用方式上有一些變化,同時支持選項式 API 和組合式 API 兩種風格。

二、選項式 API 中的生命周期鉤子

選項式 API 中的生命周期鉤子以選項的形式定義在組件中,無需導入即可直接使用。

2.1 常用生命周期鉤子及執行時機

  • beforeCreate:在實例初始化之后、數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。此時組件實例的屬性和方法尚未初始化,無法訪問 data、methods 等。
  • created:在實例創建完成后被立即調用。此時組件實例已完成數據觀測、屬性和方法的運算,但尚未開始 DOM 編譯,即未掛載到 DOM 上,無法訪問 $el。通常在此鉤子中進行數據初始化、發送初始化請求等操作。
  • beforeMount:在掛載開始之前被調用。此時模板已編譯完成,但尚未將編譯好的模板掛載到頁面中,$el 屬性已存在但未掛載。
  • mounted:在實例掛載完成后被調用。此時組件已掛載到 DOM 上,可以訪問和操作 DOM 元素,通常在此鉤子中執行需要 DOM 支持的操作,如初始化第三方插件。
  • beforeUpdate:在數據更新之前被調用,發生在虛擬 DOM 重新渲染和打補丁之前。可以在此時訪問到更新前的 DOM 狀態。
  • updated:在數據更新之后被調用,此時虛擬 DOM 已重新渲染并應用了補丁,組件 DOM 已更新。應避免在此鉤子中修改數據,以免陷入無限循環。
  • beforeUnmount:在組件實例卸載之前調用。此時組件實例仍然完全可用,可以在這里執行一些清理操作,如清除定時器、取消事件監聽等。
  • unmounted:在組件實例卸載之后調用。此時組件的所有指令和事件監聽器都已被移除,DOM 元素也已從頁面中移除。

2.2 選項式 API 生命周期鉤子使用案例

<template><div><p>{{ message }}</p><button @click="updateMessage">更新消息</button></div></template><script>export default {data() {return {message: '初始消息',timer: null}},beforeCreate() {console.log('beforeCreate 鉤子執行')console.log('此時 data 中的 message:', this.message) // undefined},created() {console.log('created 鉤子執行')console.log('此時 data 中的 message:', this.message) // 初始消息// 發送初始化請求示例console.log('發送初始化數據請求...')},beforeMount() {console.log('beforeMount 鉤子執行')console.log('此時的 $el:', this.$el) // 已存在但未掛載},mounted() {console.log('mounted 鉤子執行')console.log('此時的 $el:', this.$el) // 已掛載到 DOM// 啟動定時器示例this.timer = setInterval(() => {console.log('定時器執行中...')}, 1000)},beforeUpdate() {console.log('beforeUpdate 鉤子執行')console.log('更新前的 message:', this.message)},updated() {console.log('updated 鉤子執行')console.log('更新后的 message:', this.message)},beforeUnmount() {console.log('beforeUnmount 鉤子執行')// 清除定時器clearInterval(this.timer)console.log('定時器已清除')},unmounted() {console.log('unmounted 鉤子執行')console.log('組件已卸載')},methods: {updateMessage() {this.message = '更新后的消息'}}}</script>

在上述案例中,通過在組件選項中定義各個生命周期鉤子,我們可以清晰地看到每個鉤子的執行時機和可執行的操作。

三、組合式 API 中的生命周期鉤子

組合式 API 中的生命周期鉤子需要從 vue 中導入后才能使用,且命名以 on 開頭,例如 onMounted、onUpdated 等。

3.1 常用生命周期鉤子及對應關系

組合式 API 中的生命周期鉤子與選項式 API 中的鉤子一一對應,具體對應關系如下:

  • onBeforeMount:對應選項式 API 的 beforeMount
  • onMounted:對應選項式 API 的 mounted
  • onBeforeUpdate:對應選項式 API 的 beforeUpdate
  • onUpdated:對應選項式 API 的 updated
  • onBeforeUnmount:對應選項式 API 的 beforeUnmount
  • onUnmounted:對應選項式 API 的 unmounted

此外,組合式 API 中沒有直接對應 beforeCreate 和 created 的鉤子,因為在 setup 函數中,代碼的執行時機介于 beforeCreate 和 created 之間,因此可以將原本在 beforeCreate 和 created 中執行的操作直接寫在 setup 函數中。

3.2 組合式 API 生命周期鉤子使用案例

<template><div><p>{{ count }}</p><button @click="count++">增加計數</button></div></template><script setup>import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'const count = ref(0)let timer = null// 相當于 beforeCreate 和 created 鉤子console.log('setup 中執行(相當于 beforeCreate 和 created)')console.log('count 的初始值:', count.value)onBeforeMount(() => {console.log('onBeforeMount 鉤子執行')})onMounted(() => {console.log('onMounted 鉤子執行')// 啟動定時器timer = setInterval(() => {count.value++}, 2000)})onBeforeUpdate(() => {console.log('onBeforeUpdate 鉤子執行,更新前的 count:', count.value)})onUpdated(() => {console.log('onUpdated 鉤子執行,更新后的 count:', count.value)})onBeforeUnmount(() => {console.log('onBeforeUnmount 鉤子執行')// 清除定時器clearInterval(timer)console.log('定時器已清除')})onUnmounted(() => {console.log('onUnmounted 鉤子執行')})</script>

在組合式 API 中,生命周期鉤子以函數的形式使用,需要先導入再調用,每個鉤子函數接收一個回調函數,回調函數中包含該鉤子需要執行的操作。

四、生命周期鉤子的實際應用場景

  • 數據初始化:在 created(選項式)或 setup(組合式)中初始化組件所需的數據,例如從本地存儲中讀取數據。
  • 發送請求:在 created 或 mounted 中發送異步請求獲取后端數據,mounted 中可以結合 DOM 操作處理請求結果。
  • 初始化插件:在 mounted 中初始化需要 DOM 支持的第三方插件,如圖表插件、富文本編輯器等。
  • 監聽事件:在 mounted 中為 DOM 元素添加事件監聽器,在 beforeUnmount 中移除監聽器,避免內存泄漏。
  • 清理操作:在 beforeUnmount 中清除定時器、取消未完成的請求、解綁自定義事件等,確保組件卸載后不會留下副作用。

五、選項式 API 與組合式 API 生命周期對比

選項式 API 鉤子

組合式 API 鉤子

執行時機

beforeCreate

-

組件實例初始化前

created

-

組件實例創建后

beforeMount

onBeforeMount

組件掛載前

mounted

onMounted

組件掛載后

beforeUpdate

onBeforeUpdate

數據更新前

updated

onUpdated

數據更新后

beforeUnmount

onBeforeUnmount

組件卸載前

unmounted

onUnmounted

組件卸載后

通過對比可以看出,組合式 API 中的生命周期鉤子與選項式 API 中的鉤子功能一致,只是命名和使用方式不同。在實際開發中,可根據項目風格和個人習慣選擇合適的 API 風格。

結語:

接下來我會講解 Vue 3 中組件通信的更多方式,除了之前提到的父傳子,還會介紹子傳父、兄弟組件通信以及跨級組件通信等,并結合案例說明每種方式的實現方法和適用場景。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91522.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

負載均衡Haproxy

簡介 HAProxy是一款高性能、開源的負載均衡器與反向代理服務器&#xff0c;主要用于 HTTP、TCP等協議的流量分發&#xff0c;廣泛應用于高并發、高可用的網絡架構中 HAProxy是法國威利塔羅&#xff08;Willy Tarreau&#xff09;使用C語言開發的一個開源軟件 企業版&#xff1a…

PostgreSQL鎖機制詳解:從并發控制到死鎖檢測

PostgreSQL鎖詳解 ————向逍xiangxiaohighgo.com 首先要講鎖的話&#xff0c;必須得先了解并發控制。數據庫中的對象都是共享的&#xff0c;如果同時間不同的用戶對同一個對象進行修改&#xff0c;就會出現數據不一致的情況。所以如果要實現并發訪問&#xff0c;就需要對這…

【啟發式算法】RRT*算法詳細介紹(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;領域學習時&#xff0c;用于個人學習、研究或者欣賞使用&#xff0c;并基于博主對相關等領域的一些理解而記錄的學習摘錄和筆記&#xff0c;若有不當和侵權之處&#xff0c;指出后將會立即改正&#xff0c;還望諒…

Docker架構深度解析:從核心概念到企業級實踐

Docker架構深度解析&#xff1a;從核心概念到企業級實踐一、Docker架構全景圖1.1 整體架構示意圖二、核心組件深度解析2.1 Docker Daemon工作機制三、鏡像與容器原理3.1 鏡像分層結構3.2 容器生命周期四、網絡架構詳解4.1 網絡模式對比4.2 Bridge網絡實現原理五、存儲架構與實踐…

PPT自動化 python-pptx - 8: 文本(text)

在使用 python-pptx 庫操作 PowerPoint 文檔時&#xff0c;理解文本的結構和處理方式至關重要。本文將深入探討文本在形狀中的組織層級、訪問方式以及各級別的格式化選項。文本容器與層級結構可容納文本的形狀&#xff1a; 只有自動形狀 (Auto shapes) 和表格單元格 (table cel…

使用realsense進行目標檢測并標識目標深度

涉及知識點都在代碼中注釋了&#xff0c;直接看代碼 // This example is derived from the ssd_mobilenet_object_detection opencv demo // and adapted to be used with Intel RealSense Cameras // Please see https://github.com/opencv/opencv/blob/master/LICENSE#includ…

OpenWrt Network configuration

OpenWrt Network configuration device 和 interface 關系device device 表示底層的網絡設備&#xff0c;如物理網卡、橋接設備&#xff08;bridge&#xff09;、VLAN 設備等。 通過 config device 定義&#xff0c;描述設備類型、端口成員、VLAN 等屬性。 例如&#xff1a;br…

VuePress 使用詳解

一、核心概念 VuePress 是 Vue.js 團隊開發的靜態網站生成器&#xff0c;專為技術文檔優化&#xff0c;具備以下特性&#xff1a; Markdown 優先&#xff1a;原生支持 Markdown 語法擴展Vue 驅動&#xff1a;可在 Markdown 中使用 Vue 組件默認主題優化&#xff1a;內置響應式…

AI大模型前沿:Muyan-TTS開源零樣本語音合成技術解析

AI大模型前沿&#xff1a;Muyan-TTS開源零樣本語音合成技術解析引言&#xff1a;語音合成技術的演進與Muyan-TTS的突破性意義語音合成&#xff08;Text-to-Speech, TTS&#xff09;技術作為人機交互的核心接口之一&#xff0c;自20世紀30年代貝爾實驗室首次嘗試電子語音合成以來…

c# everthing.exe 通信

1 獲取everthing進程 調用 Everything 搜索創建SearchWithEverything函數using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Management; using System.Text;class EverythingHelper {// 方法 1&#xff1a;從進程獲取路徑publi…

Gitee:中國企業級DevOps平臺的本土化突圍之路

Gitee&#xff1a;中國企業級DevOps平臺的本土化突圍之路 在國內數字化轉型浪潮下&#xff0c;DevOps平臺作為企業研發效能提升的核心引擎&#xff0c;正在經歷從工具到生態的全面升級。作為國內領先的一站式DevOps解決方案&#xff0c;Gitee憑借其本土化優勢與全鏈路服務能力&…

C++法則22:運算符 ::* 和 ->* 和 ::* 是獨特的整體運算符,是不可分的。

C法則22&#xff1a;運算符 ::* 和 ->* 和 ::* 是獨特的整體運算符&#xff0c;是不可分的。1. ::*&#xff08;成員指針聲明符&#xff09;作用&#xff1a;用于聲明一個指向類成員的指針。語法&#xff1a;ReturnType (ClassName::*pointerName) &ClassName::MemberN…

Linux系統管理習題

Linux 系統管理練習題 1.請為此虛擬機配置以下網絡參數&#xff1a; 1&#xff09;主機名&#xff1a;chenyu.example.com &#xff08;將chenyu改成自己名字的全拼&#xff09; 2&#xff09;IP 地址&#xff1a;192.168.100.100/24 3&#xff09;默認網關&#xff1a;192.168…

SQL166 每天的日活數及新用戶占比

SQL166 每天的日活數及新用戶占比 題目理解 本SQL查詢旨在分析用戶活躍數據&#xff0c;計算兩個關鍵指標&#xff1a; 每日活躍用戶數(DAU)每日新增用戶占比(新用戶占活躍用戶的比例) 解題思路 1. 數據準備階段 首先我們需要獲取所有用戶的活躍記錄&#xff0c;包括&…

【33】C# WinForm入門到精通 ——表格布局器TableLayoutPanel【屬性、方法、事件、實例、源碼】

WinForm 是 Windows Form 的簡稱&#xff0c;是基于 .NET Framework 平臺的客戶端&#xff08;PC軟件&#xff09;開發技術&#xff0c;是 C# 語言中的一個重要應用。 .NET 提供了大量 Windows 風格的控件和事件&#xff0c;可以直接拿來使用。 本專欄內容是按照標題序號逐漸…

uv使用教程

以下是使用 Python 包管理工具 uv 的常見命令指南。uv 是由 Astral&#xff08;Ruff 的開發者&#xff09;開發的高性能 Python 包安裝器和解析器&#xff0c;旨在替代 pip 和 pip-tools&#xff1a; 1. 安裝 uv uv官網倉庫 # Linux/macOS curl -Ls https://astral.sh/uv/in…

SpringBoot3.x入門到精通系列:1.1 簡介與新特性

SpringBoot 3.x 簡介與新特性 &#x1f4d6; 什么是SpringBoot SpringBoot是由Pivotal團隊提供的全新框架&#xff0c;其設計目的是用來簡化Spring應用的初始搭建以及開發過程。SpringBoot集成了大量常用的第三方庫配置&#xff0c;SpringBoot應用中這些第三方庫幾乎可以零配…

二、搭建springCloudAlibaba2021.1版本分布式微服務-Nacos搭建及服務注冊和配置中心

nacos介紹 1、Nacos簡介 Nacos 是阿里巴巴推出來的一個新開源項目&#xff0c;這是一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。 Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集&#xff0c;幫助您快速實現動態服務發現、…

淺談物聯網嵌入式程序開發源碼技術方案

在物聯網蓬勃發展的時代&#xff0c;嵌入式程序作為連接硬件與軟件的橋梁&#xff0c;發揮著至關重要的作用。以“邊緣智能 云協同”為核心&#xff0c;為工業、醫療、家居、農業、智慧城市五大場景提供穩定、低功耗、可擴展的物聯網終端與平臺一體化解決方案。以下董技叔軟件…

【筆記】重學單片機(51)

為學習嵌入式做準備&#xff0c;重新拿起51單片機學習。此貼為學習筆記&#xff0c;僅記錄易忘點&#xff0c;實用理論基礎&#xff0c;并不是0基礎。 資料參考&#xff1a;清翔零基礎教你學51單片機 51單片機學習筆記1. C語言中的易忘點1.1 數據類型1.2 位運算符1.3 常用控制語…