你真的會使用Vue3的onMounted鉤子函數嗎?Vue3中onMounted的用法詳解

目錄

一、onMounted的前世今生

1.1、onMounted是什么

1.2、onMounted在vue2中的前身

1.2.1、vue2中的onMounted

1.2.2、Vue2與Vue3的onMounted對比

1.3、vue3中onMounted的用法

1.3.1、基礎用法

1.3.2、順序執行異步操作

1.3.3、并行執行多個異步操作

1.3.4、執行一次性副作用

1.3.5、清理工作(較少用)

1.3.6、組合使用(特定情況用)

1.3.7、直接將封裝好的函數傳遞給onMounted鉤子函數調用

二、總結


一、onMounted的前世今生

1.1、onMounted是什么

????????onMounted鉤子函數在組件實例被成功掛載后調用,此時你可以訪問到 DOM 元素。它返回一個函數,可以用于在組件卸載時進行清理。

? ? ? ? 可以說onMounted鉤子函數是最常用的鉤子函數了,玩轉onMounted鉤子函數,是寫出優雅的vue前端代碼的關鍵步驟。

1.2、onMounted在vue2中的前身

1.2.1、vue2中的onMounted

????????在Vue 2中,onMounted鉤子的前身實際上是mounted生命周期鉤子。在Vue 2的Options API中,生命周期鉤子是作為組件的選項來定義的。

????????在Vue 2的組件中,mounted鉤子用于執行那些需要在組件實例掛載到DOM之后運行的代碼,這通常包括DOM操作、數據請求等。

????????比如:

export default {data() {return {// 組件的數據};},mounted() {// 組件掛載完成后的副作用操作console.log('組件已掛載到DOM');// 可以執行DOM操作或數據請求等},methods: {// 組件的方法}
};

1.2.2、Vue2與Vue3的onMounted對比

  • Vue 2:使用mounted作為組件的一個選項來執行掛載后的代碼。
  • Vue 3:使用onMounted作為Composition API的鉤子來執行掛載后的代碼。

????????在Vue 3中,onMounted是Composition API的一部分,它提供了更靈活的方式來組織組件的邏輯。Vue 3的onMounted與Vue 2的mounted在功能上相似,都是在組件掛載完成后執行,但onMounted作為Composition API的一部分,可以更好地與其它Composition API一起使用,提供更細粒度的控制和更好的組合性。

1.3、vue3中onMounted的用法

1.3.1、基礎用法

? ? ? ? 這個沒什么可說的,和watch、interval語法結構一樣。

import { onMounted, ref } from 'vue';export default {setup() {const count = ref(0);onMounted(() => {// 在這里可以執行DOM操作或數據請求console.log('組件已掛載');});// 也可以返回一個函數進行清理return {count};}
};

1.3.2、順序執行異步操作

????????onMounted 也常用于執行順序異步操作,如發起網絡請求。

import { onMounted, ref } from 'vue';
import axios from 'axios';export default {setup() {const data = ref(null);onMounted(async () => {try {const response = await axios.get('https://api.example.com/data');data.value = response.data;const response2 = await axios.get('https://api.example.com/data2');data.value2 = response2.data;const response3 = await axios.get('https://api.example.com/data3');data.value3 = response3.data;const response4 = await axios.get('https://api.example.com/data4');data.value4 = response4.data;// ...更多的異步操作} catch (error) {console.error('請求錯誤:', error);}});return {data};}
};

1.3.3、并行執行多個異步操作

????????onMounted 也常用于執行并行異步操作,也可以發起網絡請求。但據我實際使用的經歷來看,異步操作能在首屏加載、大量圖片等資源加載時發揮不錯的作用。

import { ref, onMounted } from 'vue';
import axios from 'axios';export default {setup() {// 聲明響應式數據引用const data = ref(null);const data2 = ref(null);const data3 = ref(null);const data4 = ref(null);onMounted(async () => {// 使用Promise.all來處理并發的axios請求await Promise.all([axios.get('https://api.example.com/data'),axios.get('https://api.example.com/data2'),axios.get('https://api.example.com/data3'),axios.get('https://api.example.com/data4')]).then(responses => {// 所有請求成功完成后,更新響應式數據data.value = responses[0].data;data2.value = responses[1].data;data3.value = responses[2].data;data4.value = responses[3].data;// 這里可以放置所有異步任務完成后的代碼...}).catch(error => {// 處理請求中出現的任何錯誤console.error('請求錯誤:', error);});});// 返回響應式狀態供模板或其他Composition API使用return {data,data2,data3,data4};}
};

1.3.4、執行一次性副作用

????????如果你需要執行一次性的副作用(side effect),onMounted 是一個理想的地方。

????????"副作用"(side effect)是指函數在執行時除了返回值之外對外部環境產生的影響。這些影響可能包括但不限于:

  • 修改全局變量:改變在函數外部定義的變量的值。
  • 執行I/O操作:如讀寫文件、網絡請求、控制臺日志輸出等。
  • 修改外部對象或數組:影響傳入函數的參數對象或數組的狀態。
  • 觸發事件:如點擊事件、網絡事件等。
  • 定時器設置:設置 setTimeout 或 setInterval。

? ? ? ? 這里是利用onMounted鉤子函數在組件實例被成功掛載后調用的時序特性,這個組件實例已經掛載,頁面首次渲染的時機。在這個階段可以執行很多操作。

import { onMounted } from 'vue';export default {setup() {onMounted(() => {// 執行一次性副作用console.log('這是一個一次性副作用');});return {};}
};

1.3.5、清理工作(較少用)

????????onMounted 提供的函數可以用于注冊清理工作,這在處理定時器或監聽器時非常有用。不過在onMounted清理的比較少,我見到的在onBeforeUnmount鉤子函數清理定時器、監聽器的比較多。

import { onMounted, ref } from 'vue';export default {setup() {const count = ref(0);const intervalId = setInterval(() => {count.value++;}, 1000);// 注冊清理工作const cleanup = onMounted(() => {return () => {clearInterval(intervalId);console.log('定時器已清理');};});return {count,cleanup};}
};

1.3.6、組合使用(特定情況用)

????????onMounted 可以與Vue 3的其他Composition API一起使用,以實現復雜的邏輯。這里主要是改變了watch的啟動時機,本來是在setup階段啟動watch偵聽器,但是這樣寫就變成了在onMounted階段啟動偵聽器。

import { onMounted, ref, watch } from 'vue';export default {setup() {const data = ref(null);onMounted(() => {// 可以組合使用其他Composition APIwatch(data, (newValue, oldValue) => {console.log(`數據從 ${oldValue} 變更為 ${newValue}`);});});// 模擬數據變化setTimeout(() => {data.value = { name: '新數據' };}, 2000);return {data};}
};

1.3.7、直接將封裝好的函數傳遞給onMounted鉤子函數調用

? ? ? ? Vue3中onMounted可以重復使用,多次使用,并不是像vue2那樣要寫在某一個對象里面。但一般不推薦多次使用,這相當于多個onMounted異步執行操作,分散地寫只會增加long terms的可維護性,降低可讀性,哪怕是為了迎合和充分利用composition API的特點,我也覺得弊大于利。

function task1() {// 初始化任務1
}function task2() {// 初始化任務2
}onMounted(task1);
onMounted(task2);

二、總結

????????onMounted作為vue3中最常用的鉤子函數之一,能夠靈活、隨心應手的使用是每個Vue開發者的必修課,同時根據其不同寫法的特性,來選擇最合適最有利于維護的寫法。

????????博客不應該只有代碼和解決方案,重點應該在于給出解決方案的同時分享思維模式,只有思維才能可持續地解決問題,只有思維才是真正值得學習和分享的核心要素。如果這篇博客能給您帶來一點幫助,麻煩您點個贊支持一下,還可以收藏起來以備不時之需,有疑問和錯誤歡迎在評論區指出~

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

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

相關文章

Rust腐蝕怎么用服務器一鍵開服聯機教程

1、進入控制面板 首次登陸需要點擊下方重置密碼,如何再點擊登錄面板,點擊后會跳轉到登錄頁面,輸入用戶名和密碼登錄即可 2、設置游戲端口 由于腐蝕的設置需要三個端口,它們用于游戲端口(必須為首選端口)&a…

jenkins 部署golang 應用到k8s與測試環境

1.宿主機安裝jenkins 不要用docker 為什么:docker jenkins你只有jenkins, 你想做golang編譯的情況,它的鏡像里面缺少go環境。 而宿主機安裝的情況,jenkins是可以通過環境變量修改來訪問宿主機里面安裝的內容。 2.插件 // docke…

FFMPEG 解碼過程初步學習

1. 視頻文件解碼過程 解碼過程 步驟如下: 視頻文件(封裝格式,MP4/FLV/AVI 等)獲取視頻格式信息等解復用為Stream 流, 準備解碼用的Codec將Stream 流 使用解碼器解為Raw 格式針 1.1 音視頻格式填充: int…

找不到msvcr110.dll無法繼續執行代碼的原因分析及解決方法

在計算機使用過程中,我們經常會遇到一些錯誤提示,其中之一就是找不到msvcr110.dll文件。這個錯誤通常發生在運行某些程序或游戲時,系統無法找到所需的動態鏈接庫文件。為了解決這個問題,下面我將介紹5種常見的解決方法。 一&#…

Vue3實現上傳照片以及回顯

Vue3實現上傳照片以及回顯 一、安裝Element Plus二、案例1、基本示例 三、進階案例1、代碼2、代碼解釋1、上傳接口展示2、查詢接口展示組件屬性 3、效果展示 一、安裝Element Plus 使用 Element Plus 組件庫來實現上傳照片和回顯同樣很簡單,你可以按照以下步驟進行…

用棧實現隊列(C語言)

目錄 題目題目分析 代碼棧的實現結構體。棧的初始化棧的銷毀 入棧刪除查找頂部數據判空 答案結構體初始化插入數據刪除數據獲取隊列開頭元素判空銷毀棧 題目 題目分析 鏈接: 題目 請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(push、po…

數據庫查詢中——having與where的用法

數據庫查詢中——having與where的用法 HAVING 子句在 SQL 中主要用于與 GROUP BY 子句一起使用,以過濾聚合函數的結果。當你使用 GROUP BY 對數據進行分組,并希望基于這些分組后的數據進一步過濾時,你會使用 HAVING 子句。 HAVING 子句通常與…

pyside6下沒有designer.exe、pyside6-uic.exe等

使用conda安裝的pyside6(conda install pyside6),發現pyside6目錄下沒有designer.exe、pyside6-uic.exe等;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安裝…

企業內網自建yum源 倉庫 | rsync同步方案

文章目錄 1.背景概述2.獲取軟件文件2.1 準備同步腳本如下 2.2 準備例外文件清單2.3 統計源端大小2.3 運行腳本開始同步文件 3. 創建網頁服務3.1 安裝nginx并啟用3.2 修改ngnix配置文件 4 創建repo索引和客戶文件4.1 創建repo索引4.2 創建客戶端文件4.3 客戶端下載repo文件 1.背…

用 Python 編寫網絡爬蟲:從網頁獲取數據并存儲到 Excel 文件

在本篇博客中,我們將介紹如何使用 Python 編寫一個簡單的網絡爬蟲,用于從網頁中提取數據,并將這些數據存儲到 Excel 文件中。我們將使用 Python 中的一些庫來實現這個功能,包括 urllib.request、BeautifulSoup 和 openpyxl。 1. 網絡爬蟲的基本原理 網絡爬蟲是一種程序,…

【MyBatis】MyBatis解析全局配置文件源碼詳解

目錄 一、前言 思維導圖概括 二、配置文件解析過程分析 2.1 配置文件解析入口 2.2 初始化XMLConfigBuilder 2.3 XMLConfigBuilder#parse()方法:解析全局配置文件 2.3.1 解析properties配置 2.3.2 解析settings配置 2.3.2.1 元信息對象(MetaClas…

解決移植Metasploitable3到VM虛擬機無網絡的問題

第一步 導入后不要開機,先在虛擬機設置里面將原有的兩個網絡適配器移除。 第二步 接著在選項里面,在客戶機操作系統里面,選擇Microsoft Windwos(W), 版本選擇Windows Server 2008 R2 x64 第三步 先打開虛擬機,然后…

Python_文件操作_學習

目錄 一、關于文件的打開和關閉 1. 文件的打開 2.文件的關閉 二、文件的讀取 1. 文件的讀_r 2. 使用readline 3.使用readlines 三、文件的寫入 1. 文本的新建寫入 2.文本的追加寫入 四、文件的刪除和重命名 1.文件的重命名 2.文件的刪除 五、文件的定位讀寫 1.t…

RK 11.0 多屏模式下修改鼠標進入方式

要求:主屏在左,副屏在右。這種排列情況下鼠標僅可通過主屏的最右側移入副屏的最左側,或從副屏的最左側移入主屏最右側。 1.RK默認設計 1.1 RK的代碼設計是當sys.mouse.presentation1時,鼠標在屏幕邊緣的時候就會移入另一個屏幕 …

CISP-PTE筆記整理

目錄 漏洞基礎代碼合集 網安基礎 常見名詞 信息收集 環境和變量的配置 HTTP請求頭基礎 HTTP基礎知識 MySql基礎語法 各系統的敏感目錄路徑 工具使用 Hackbar的tips java下載配置 Xray下載配置&使用 burp爆破賬號密碼和C段&注意事項 SqlMap爆破&創建…

Unity Miscellaneous入門

概述 在Unity中有非常多好用的組件,也是Unity為我們提供的方便的開發工具,它的功能可能不是主流的內容,比如渲染,音樂,視頻等等,所有Unity把這些內容統一歸到了一個雜項文件組中。 Unity組件入門篇總目錄-…

Python線程

Python線程 1. 進程和線程 先來了解下進程和線程。 類比: 一個工廠,至少有一個車間,一個車間中至少有一個工人,最終是工人在工作。 一個程序,至少有一個進程,一個進程中至少有一個線程,最終…

langchain實戰-從0到1搭建ai聊天機器人

介紹 當前,人工智能大模型公司如雨后春筍般迅速涌現,例如 OpenAI、文心一言、通義千問等,它們提供了成熟的 API 調用服務。然而,隨之而來的是不同公司的繁瑣協議接入過程,這讓許多開發者感到頭疼不已。有沒有一種統一…

SpringBoot + Redis實現對接口的限流

目錄 前言 什么是限流? 實現限流 創建一個注解類 接著創建一個切面類 前言 在項目中,對于接口的限流,是任何項目都必不可少的一部分,主要是為了防止用戶頻繁的發送請求,對服務器造成壓力。 另外一點就是防止外來攻…