【vue-8】Vue3 Options API 生命周期函數全面解析

在 Vue.js 開發中,理解組件的生命周期是構建健壯應用程序的關鍵。雖然 Vue3 引入了 Composition API,但 Options API 仍然是許多開發者的首選,特別是對于從 Vue2 遷移的項目或更喜歡基于選項的代碼組織的團隊。本文將深入探討 Vue3 中 Options API 的生命周期函數,幫助您掌握組件從創建到銷毀的完整過程。

1. 生命周期概覽

Vue3 的生命周期與 Vue2 相比有一些變化,主要是為了更好的支持 Composition API 并優化性能。以下是完整的生命周期圖示:

setup (Composition API 特有)
|
└── beforeCreate└── created└── beforeMount└── mounted├── beforeUpdate│   └── updated├── activated (keep-alive 組件特有)│   └── deactivated (keep-alive 組件特有)└── beforeUnmount└── unmounted

2. 各生命周期鉤子詳解

2.1 beforeCreate

觸發時機:在實例初始化之后,數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。

典型用途

  • 執行一些不依賴響應式數據的初始化邏輯
  • 設置一些實例屬性,這些屬性可能在后續的 created 鉤子中使用
export default {beforeCreate() {console.log('beforeCreate: 實例剛創建,數據觀測未初始化');console.log(this.$data); // undefinedconsole.log(this.someData); // undefined},data() {return {someData: 'Hello'}}
}

2.2 created

觸發時機:在實例創建完成后被立即調用。在這一步,實例已完成以下配置:

  • 數據觀測 (data observer)
  • 屬性和方法的運算
  • watch/event 事件回調

典型用途

  • 訪問響應式數據
  • 發起異步請求獲取數據
  • 初始化一些需要響應式數據的邏輯
export default {data() {return {message: 'Hello Vue!'}},created() {console.log('created: 實例已創建,數據觀測已初始化');console.log(this.message); // 'Hello Vue!'// 發起API請求this.fetchData();},methods: {fetchData() {// 異步數據獲取邏輯}}
}

2.3 beforeMount

觸發時機:在掛載開始之前被調用,相關的 render 函數首次被調用。

典型用途

  • 在組件掛載到DOM之前執行最后的準備工作
  • 很少需要在此鉤子中進行操作,大多數情況下使用 created 或 mounted 更合適
export default {beforeMount() {console.log('beforeMount: 模板編譯完成,即將掛載到DOM');console.log(this.$el); // undefined,尚未掛載}
}

2.4 mounted

觸發時機:實例被掛載后調用,這時 el 被新創建的 vm.$el 替換。

典型用途

  • 訪問或操作DOM元素
  • 集成第三方庫需要DOM存在的場景
  • 執行依賴于DOM的初始化操作
export default {mounted() {console.log('mounted: 實例已掛載到DOM');console.log(this.$el); // 可以訪問DOM元素// 使用第三方圖表庫this.initChart();},methods: {initChart() {const ctx = this.$refs.chartCanvas.getContext('2d');// 初始化圖表...}}
}

2.5 beforeUpdate

觸發時機:數據更新時調用,發生在虛擬 DOM 打補丁之前。

典型用途

  • 在組件更新前訪問現有的DOM狀態
  • 跟蹤組件更新前的狀態
export default {data() {return {counter: 0}},beforeUpdate() {console.log('beforeUpdate: 數據即將更新');console.log('當前值:', this.$refs.counter.textContent);}
}

2.6 updated

觸發時機:由于數據更改導致的虛擬 DOM 重新渲染和打補丁后調用。

典型用途

  • 執行依賴于DOM更新的操作
  • 謹慎使用,避免在此鉤子中修改狀態,可能導致無限更新循環
export default {data() {return {items: []}},updated() {console.log('updated: DOM已更新');// 在列表更新后滾動到底部this.$refs.list.scrollTop = this.$refs.list.scrollHeight;}
}

2.7 beforeUnmount (Vue2中的beforeDestroy)

觸發時機:實例銷毀之前調用。在這一步,實例仍然完全可用。

典型用途

  • 清理定時器
  • 取消事件監聽
  • 清理第三方庫的實例
export default {data() {return {timer: null}},created() {this.timer = setInterval(() => {console.log('Timer tick');}, 1000);},beforeUnmount() {console.log('beforeUnmount: 實例即將銷毀');clearInterval(this.timer);}
}

2.8 unmounted (Vue2中的destroyed)

觸發時機:實例銷毀后調用。調用后,Vue 實例指示的所有東西都會解綁定,所有的事件監聽器會被移除,所有的子實例也會被銷毀。

典型用途

  • 執行最后的清理工作
  • 報告分析數據或日志
export default {unmounted() {console.log('unmounted: 實例已銷毀');// 發送日志this.sendAnalytics('Component destroyed');}
}

2.9 activated 和 deactivated (keep-alive 特有)

觸發時機

  • activated:被 keep-alive 緩存的組件激活時調用
  • deactivated:被 keep-alive 緩存的組件失活時調用

典型用途

  • 恢復或暫停組件特定的行為
  • 獲取最新數據(activated)
  • 保存組件狀態(deactivated)
export default {activated() {console.log('activated: 組件被激活');// 獲取最新數據this.fetchData();},deactivated() {console.log('deactivated: 組件被緩存');// 保存滾動位置this.scrollPosition = this.$refs.list.scrollTop;}
}

3. Vue2 到 Vue3 的生命周期變化

  1. 重命名:

    • beforeDestroybeforeUnmount
    • destroyedunmounted
  2. 新增:

    • renderTrackedrenderTriggered(主要用于調試)
  3. 行為變化:

    • 生命周期鉤子現在都使用異步隊列執行,確保一致性

4. 最佳實踐

  1. 數據獲取:通常在 created 鉤子中進行異步數據獲取,這樣可以在組件掛載前盡早開始請求。

  2. DOM操作:必須在 mounted 鉤子中進行,因為只有這時DOM才存在。

  3. 清理工作:在 beforeUnmount 中清理定時器、事件監聽器等,防止內存泄漏。

  4. 避免在 updated 中修改狀態:這可能導致無限更新循環。

  5. keep-alive 組件優化:使用 activateddeactivated 來管理緩存組件的狀態。

  6. 代碼組織:將相關生命周期邏輯分組注釋,提高代碼可讀性。

export default {// 數據相關data() { /* ... */ },created() { /* 數據初始化 */ },// DOM相關mounted() { /* DOM操作 */ },beforeUnmount() { /* 清理DOM相關資源 */ },// 狀態更新相關beforeUpdate() { /* 更新前操作 */ },updated() { /* 更新后操作 */ },// keep-alive相關activated() { /* 恢復狀態 */ },deactivated() { /* 保存狀態 */ }
}

5. 常見問題解答

Q: created 和 mounted 哪個更適合發起API請求?

A: 通常建議在 created 中發起API請求,這樣可以盡早開始數據獲取,減少用戶等待時間。只有在請求結果直接影響DOM時才需要在 mounted 中發起請求。

Q: 為什么我的 beforeUpdate 鉤子沒有被觸發?

A: beforeUpdate 只在響應式數據變化導致重新渲染時觸發。如果您的數據變化不影響模板,或者使用了非響應式數據,鉤子不會被調用。

Q: Vue3 中是否可以混用 Options API 和 Composition API 的生命周期?

A: 可以,但不推薦。Composition API 使用 setup() 函數中的生命周期鉤子(如 onMounted),而 Options API 使用我們討論的這些鉤子。混用可能導致邏輯分散,降低代碼可讀性。

6. 結語

理解 Vue3 的 Options API 生命周期鉤子是構建高效、可維護 Vue 應用程序的基礎。通過合理利用這些鉤子,您可以精確控制組件的行為,優化性能,并避免常見問題。隨著對生命周期的深入理解,您將能夠編寫出更加健壯和可預測的 Vue 組件。

記住,雖然生命周期鉤子提供了強大的控制能力,但過度使用它們可能導致代碼難以維護。始終考慮是否有更簡單的方式來實現您的需求,例如使用計算屬性或偵聽器來代替某些生命周期邏輯。

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

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

相關文章

周志華《機器學習導論》第8章 集成學習 Ensemble Learning

目錄 8.1 個體與集成 8.2 Boosting Ada(Adaptive)Boost 8.3 Bagging 8.4 隨機森林 8.5 結合策略 8.5.1 平均法 8.5.2 投票法 8.5.3 學習法 8.6 多樣性 8.6.1 誤差-分歧分解 error-ambiguity 8.6.2 多樣性度量 8.6.3 多樣性增強 8.1 個體與集…

Embassy實戰:Rust嵌入式異步開發指南

嵌入式異步框架 Embassy 實例 以下是關于嵌入式異步框架 Embassy 的實用示例,涵蓋常見外設操作、多任務協作和硬件交互場景。示例基于STM32和Raspberry Pi Pico等平臺,使用Rust語言編寫。 GPIO 控制 use embassy_stm32::gpio::{Input, Output, Pull, Speed}; use embassy_…

ChatGPT桌面版深度解析

ChatGPT桌面版深度解析:功能、安裝與高效使用全攻略 一、核心功能全景解析 (一)全場景交互體系 全局熱鍵喚醒 支持MacOS(Option空格)與Windows(Alt空格)全局快捷鍵,實現跨應用無縫調…

RLVR的一種擴展方案--RLPR論文閱讀

論文鏈接:RLPR: EXTRAPOLATING RLVR TO GENERAL DOMAINS WITHOUT VERIFIERS 文章目錄簡介RLPRRLVR概率獎勵/Probability Reward獎勵設計標準差過濾總結簡介 可驗證獎勵的強化學習(Reinforcement Learning with Verifiable Rewards, RLVR)在提升大語言模型&#xff…

odoo歐度小程序——添加用戶

odoo歐度小程序添加登錄用戶 1. 直接在登錄用戶頁面添加用戶點擊 添加登錄用戶輸入用戶和密碼,點擊登錄驗證進入odoo頁面2. 在用戶切換頁面添加用戶點擊選擇切換用戶點擊域名彈出菜單點擊添加新用戶輸入用戶和密碼,點擊登錄驗證進入odoo頁面

Docker 應用數據備份、遷移方案

一、為什么要做Docker數據備份1、保障數據與配置的安全性防止數據丟失:Docker 容器本身是 “臨時性” 的(基于鏡像創建,刪除后數據默認丟失),但容器中運行的應用(如數據庫、日志服務)會產生持久…

【PTA數據結構 | C語言版】強連通分量

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 本題請你編寫程序,輸出給定有向圖中的各個強連通分量,并統計強連通分量的個數。 輸入格式: 輸入首先在第一行給出 2 個整數,依次為有向圖的頂點數 n&…

idea部署新項目時,用自定義的maven出現的問題解決

出現這個問題是因為maven版本和idea版本不兼容,例如圖示是maven3.9和idea2021.3的版本不兼容,maven換成3.8.x即可解決

OCR 身份識別:讓身份信息錄入場景更高效安全

在銀行柜臺開戶、線上平臺實名認證等場景中,身份信息錄入是基礎環節,OCR 身份識別產品正成為提升效率與安全性的關鍵。?傳統人工錄入身份證信息,不僅耗時久,還易因手誤導致姓名、號碼出錯,影響業務辦理進度。而 OCR 身…

Web 服務器和Web 中間件

一、什么是 Web 中間件 Web 中間件(Web Middleware)是運行在 Web 服務器與實際業務程序之間的一層“膠水”軟件,用來統一處理公共事務,讓開發者專注寫業務邏輯。常見職責: 請求/響應攔截(鑒權、日志、跨域、…

Paimon的部分更新以及DeleteVector實現

背景 本文基于 Paimon 0.9 出于對與Paimon內部的DeleteVctor的實現以及部分更新的實現進行的源碼閱讀。 關于 DeleteVector的介紹可以看這里 說明 對于Paimon來說無論是Spark中使用還是Flink使用,后面的邏輯都是一樣的,所以我們以Spark為例來說。所以…

Redis 的事務機制是怎樣的?

Redis 的事務機制 Redis支持事務機制,其主要目的是確保多個命令執行的原子性,即這些命令會作為一個不可分割的操作單元執行。 需要注意的是,Redis事務不支持回滾操作。從Redis 2.6.5版本開始,服務器會在命令累積階段檢測錯誤。在執行EXEC命令時,若發現錯誤則會拒絕執行事…

網安學習NO.17

1. VPN 概述定義:在公用網絡(如 Internet、幀中繼、ATM 等)中,通過技術手段虛擬出的一條企業內部專線,能像私有網絡一樣提供安全性、可靠性和可管理性。核心特征:利用公共網絡構建,具備 “虛擬性…

MCU芯片AS32S601在衛星光纖放大器(EDFA)中的應用探索

摘要:本文聚焦于國科安芯推出的AS32S601型MCU芯片在衛星光纖放大器(EDFA)中的潛在應用,探討其技術特性、抗輻射性能及適用性。通過分析其在單粒子效應脈沖激光試驗中的表現,結合EDFA系統對控制芯片的要求,評…

Hexo - 免費搭建個人博客02 - 創建個人博客

導言我的博客:https://q164129345.github.io/ 開始一步一步地完成博客的創建。 一、初始化Hexo博客以上所示,運行以下指令在myCode文件夾里初始化一個hexo博客。 hexo init myblog二、安裝依賴如上所示,完成依賴的安裝。 cd myblog npm insta…

單片機-----基礎知識整合

一、基礎知識1)單片機的組成:中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、定時器、多種I/O接口、中斷系統等2)STM32U575RIT6采用ARM Cortex-M33內核架構ARM是什么?①ARM是一家公司,ARM公司是一家芯片知識產權&#…

雙流join 、 Paimon Partial Update 和 動態schema

背景 Paimon 通過其獨特的 partial-update 合并引擎和底層的 LSM 存儲結構,巧妙地將傳統雙流 Join 中對 Flink State 的高頻隨機讀/寫,轉換為了對 Paimon 表的順序寫和后臺的高效合并,從而一站式地解決了 Flink 作業狀態過大、依賴外部 KV 系…

7.3.1 進程調度機制那些事兒

一:task_struct結構體分析 1、進程有兩種特殊形式:沒有用戶虛擬地址空間的進程叫內核線程,共享用戶虛擬地址空間的進程叫作用戶線程。共享同一個用戶虛擬地址空間的所有用戶線程叫線程組。 C語言標準庫進程 Linux內核進程 …

基于多種機器學習的水質污染及安全預測分析系統的設計與實現【隨機森林、XGBoost、LightGBM、SMOTE、貝葉斯優化】

文章目錄有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源,或者部署調試可以私信博主 項目介紹 隨著工業化和城市化的不斷推進,水質污染問題逐漸成為影響生態環境…

Linux第三天Linux基礎命令(二)

1.grep命令可以通過grep命令,從文件中通過關鍵字過濾文件行。grep [-n] 關鍵字 文件路徑選項-n,可選,表示在結果中顯示匹配的行的行號。參數,關鍵字,必填,表示過濾的關鍵字,帶有空格或其它特殊符…