Vue 3 官方 Hooks 的用法與實現原理

Vue 3 引入了 Composition API,使得生命周期鉤子(hooks)在函數式風格中更清晰地表達。本篇文章將從官方 hooks 的使用、實現原理以及自定義 hooks 的結構化思路出發,全面理解 Vue 3 的 hooks 系統。


📘 1. Vue 3 官方生命周期 hooks 一覽

Hook 函數觸發時機
onBeforeMount組件掛載前
onMounted組件掛載后
onBeforeUpdate數據變更、視圖更新前
onUpdated數據變更、視圖更新后
onBeforeUnmount卸載前
onUnmounted卸載后
onActivated<KeepAlive> 激活時
onDeactivated<KeepAlive> 失活時
onErrorCaptured錯誤捕獲
onRenderTracked響應式依賴追蹤
onRenderTriggered響應式依賴觸發更新

? 2. 使用示例

<script setup>
import { onMounted } from 'vue'onMounted(() => {console.log('組件已掛載完成')
})
</script>

<script setup> 中調用 hooks 更簡潔,無需訪問 setup() 返回對象。


🧠 3. 實現原理解析

生命周期 hooks 的注冊基于當前組件實例 currentInstance

export function onMounted(hook: Function, target = currentInstance) {return injectHook('mounted', hook, target)
}

核心函數 injectHook

function injectHook(type: LifecycleHooks, hook: Function, target) {const hooks = target[type] || (target[type] = [])hooks.push(hook)
}

當組件進入對應生命周期階段時,Vue 內部會遍歷執行掛載在實例上的所有該類型 hook。


?? 4. 自定義 Hooks(組合邏輯復用)

Vue 3 鼓勵將邏輯拆分為 useXxx 函數,以便跨組件復用。

🎯 示例:useWindowSize

// useWindowSize.ts
import { ref, onMounted, onUnmounted } from 'vue'export function useWindowSize() {const width = ref(window.innerWidth)const height = ref(window.innerHeight)const update = () => {width.value = window.innerWidthheight.value = window.innerHeight}onMounted(() => window.addEventListener('resize', update))onUnmounted(() => window.removeEventListener('resize', update))return { width, height }
}

使用方式:

<script setup>
import { useWindowSize } from '@/hooks/useWindowSize'const { width, height } = useWindowSize()
</script>

🧠 自定義 hooks 的原理

  • 本質是普通函數,內部調用 Vue 組合式 API(如 ref, watch, onMounted
  • 在組件 setup() 時執行,響應式變量掛接到當前組件上下文
  • 內部調用生命周期鉤子時會依賴當前的 getCurrentInstance()

📌 5. 總結對比

類型示例作用特點
官方生命周期 HookonMounted()注冊生命周期回調由 Vue 內部調度
自定義 HookuseMousePosition()封裝響應式狀態 + 邏輯復用是普通函數,可組合嵌套

📚 推薦閱讀

  • Vue 3 官方生命周期 API
  • Vue 核心源碼 Lifecycle 實現
  • VueUse - 高質量 Hooks 集合

?? 結語

生命周期 hooks 是 Vue 3 中非常核心的機制之一。理解它們的用法與實現,有助于我們編寫結構清晰、邏輯可復用的組件。

如果你對 Vue 源碼感興趣,不妨進一步探索 Vue 是如何依賴 currentInstance 來處理作用域鉤子的注冊和調用的。

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

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

相關文章

大語言模型 17 - MCP Model Context Protocol 介紹對比分析 基本環境配置

MCP 基本介紹 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一種開放協議&#xff0c;旨在標準化應用程序向大型語言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 提供了一種…

云原生安全之PaaS:從基礎到實踐的技術指南

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 云原生安全之PaaS:從基礎到實踐的技術指南 一、基礎概念 PaaS(Platform as a Service)平臺 PaaS是一種云計算服務模型,為開發者提供應用程序的開發、部署和運行環境,涵…

Chrome中http被強轉成https問題

原因&#xff1a;2023年11月1日&#xff0c;chrome發布HTTPS-Upgrades功能&#xff0c;在用戶訪問 http:// 的舊鏈接之后&#xff0c;會自動嘗試跳轉到通過加密的 https:// 協議&#xff0c;訪問該網站。且探測到 https 服務存在也會自動改成 https。 親測兩種方案可行&#x…

Linux 操作文本文件列數據的常用命令

文章目錄 Linux 操作文本文件列數據的常用命令基本列處理命令高級列處理列數據轉換和排序列數據統計和分析 Linux 操作文本文件列數據的常用命令 Linux 提供了多種強大的命令來處理文本文件中的列數據&#xff0c;以下是一些最常用的命令和工具&#xff1a; 基本列處理命令 c…

如何理解線性判別分析(LDA)算法?

在高維數據空間中,特征變量呈指數級增長,信息分布密集且復雜。研究者在面對海量特征時,仿佛置身于一幅結構高度抽象且維度交織的多變量圖景之中,其解析與建模猶如在一幅復雜的數據宇宙圖譜中導航,既需理論框架的指引,也依賴于算法工具的精確刻畫。如何從眾多維度中篩選出…

鴻蒙UI開發——Builder函數的封裝

1、問題引入 我們在開發中可能會遇到這樣一個問題&#xff1a;將一個Builder修飾后的函數用變量或者數組記錄下來&#xff0c;在業務其他地方使用這些Builder函數。 舉個例子&#xff0c;有下面一段代碼&#xff1a; Builderfunction builderElement() {}let builderArr: Fu…

ARM筆記-ARM指令集

第三章 ARM指令集 3.1 ARM指令集簡介 ARM微處理器的ARM指令集 &#xff0c;所有的指令長度都是32位 &#xff0c;并且大多數指令都在一個單獨指令周期內執行。 主要特點&#xff1a; 指令是條件執行的ARM微處理器的指令集是加載/存儲型的在多寄存器操作指令中一次最多可以完成…

Spring Boot接口通用返回值設計與實現最佳實踐

一、核心返回值模型設計&#xff08;增強版&#xff09; package com.chat.common;import com.chat.util.I18nUtil; import com.chat.util.TraceUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter;import java.io.Serializable;/*** 功能: 通…

2025年上半年軟件架構師考試回憶版【持續更新】

文章目錄 案例分析1、端AI相對于云AI的優勢2、redis持久化&#xff0c;主從庫3、解釋器架構風格4、知識圖譜5、區塊鏈 論文1、基于事件驅動的模型2、多模型數據庫及其應用3、負載均衡設計方法4、論軟件測試理論及其應用 考試感受 2025年軟件考試架構考試于5月24日如期舉行&…

Windows下編譯Zipios

本文記錄在Windows下編譯Zipios的流程。 注1&#xff1a;文章內容會不定期更新。 零、環境 操作系統Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、安裝依賴 二、編譯 2.1 下載代碼 git clone https://github.com/Zipios/Zi…

SOC-ESP32S3部分:11-任務創建

飛書文檔https://x509p6c8to.feishu.cn/wiki/EH3owsPahisvl6kL6k3cqaQ3n0g 在我們學習單片機的時候&#xff0c;main函數入口中一般有一個while大循環在不停輪詢&#xff0c;如果我們需要實現多種不同的業務&#xff0c;就需要用到狀態機&#xff0c;根據不同時刻的要求執行不…

[Git] 如何進行版本回退

版本控制系統最重要的能力之一&#xff0c;就是能夠輕松地在項目的不同歷史版本之間切換。有時&#xff0c;你可能發現最近的修改引入了嚴重問題&#xff0c;或者需要回到之前的某個節點重新開始。這時&#xff0c;“版本回退”功能就派上用場了。 版本回退&#xff1a;反方向…

易貝平臺關鍵字搜索技術深度解析

一、核心搜索機制 關鍵詞匹配原理 采用TF-IDF算法計算關鍵詞權重 支持同義詞擴展&#xff08;如"phone"匹配"cellphone"&#xff09; 標題權重 > 副標題 > 商品描述 搜索排序因素 # 搜索權重模擬計算 def calculate_rank(keyword, item): title…

深度剖析 MCP SDK 最新版:Streamable HTTP 模式

好記憶不如爛筆頭&#xff0c;能記下點東西&#xff0c;就記下點&#xff0c;有時間拿出來看看&#xff0c;也會發覺不一樣的感受. 目錄 一、概述 二、快速上手&#xff1a;開啟 Streamable HTTP 服務端開啟 客戶端連接 三、深入兩個核心參數 stateless_http json_resp…

樹莓派開箱上手教程(無需顯示器版)

樹莓派開箱上手教程&#xff08;無需顯示器版&#xff09; 硬件準備 名稱參數電源適配器5V電源適配器&#xff0c;至少需要3A的額定電流&#xff0c;配備USB Type-C輸出接頭microSD卡用來將樹莓派的操作系統安裝到上邊&#xff0c;至少需要8GB容量&#xff0c;一般建議16GB及以…

MySQL強化關鍵_015_存儲過程

目 錄 一、概述 1.說明 2.優點 3.缺點 二、存儲過程的操作 1.創建 2.調用 3.查看 4.刪除 三、變量 1.系統變量 &#xff08;1&#xff09;說明 &#xff08;2&#xff09;查看系統變量 &#xff08;3&#xff09;設置系統變量 2.用戶變量 &#xff08;1&…

動態規劃dp

這里寫目錄標題 動態規劃01背包完全背包多重背包混合背包二維費用的背包分組背包有依賴的背包背包問題求方案數背包問題求具體方案數位 DP狀壓 DP常用例題 動態規劃 01背包 有 n n n 件物品和一個容量為 W W W 的背包&#xff0c;第 i i i 件物品的體積為 w [ i ] w[i] w…

arcgis js統計FeatureLayer的橢球面積、平面面積

1、導入依賴 import FeatureLayer from arcgis/core/layers/FeatureLayer import { geodesicArea, planarArea, simplify } from arcgis/core/geometry/geometryEngine; import { project, load as projectionLoad } from arcgis/core/geometry/projection2、初始化project o…

2.2.1 05年T2

引言 本文將從一預習、二自習、三學習、四復習等四個階段來分析2005年考研英語閱讀第二篇文章。為了便于后續閱讀&#xff0c;我將第四部分復習放在了首位。 四、復習 方法&#xff1a;錯誤思路分析總結考點文章梳理 4.1 錯題分析 題目&#xff1a;26&#xff08;細節題&…

Java 連接并操作 Redis 萬字詳解:從 Jedis 直連到 RedisTemplate 封裝,5 種方式全解析

引言 在分布式系統和高并發場景中&#xff0c;Redis 作為高性能內存數據庫的地位舉足輕重。對于 Java 開發者而言&#xff0c;掌握 Redis 的連接與操作是進階必備技能。然而&#xff0c;從基礎的 Jedis 原生客戶端到 Spring 封裝的 RedisTemplate&#xff0c;不同連接方式的原…