Vue 3 單文件組件中 VCA 語法糖及核心特性詳解

在 Vue.js 的開發世界里,單文件組件(Single File Components,簡稱 SFC)是構建復雜應用的基石。它將 HTML、CSS 和 JavaScript 代碼封裝在一個.vue文件中,極大地提高了代碼的可維護性和復用性。

本文將深入探討單文件組件中幾個重要特性:VCA 語法糖、computed、watch、props 與 emit,以及 provide 和 inject 的使用。

一、VCA 語法糖:讓代碼更簡潔優雅

VCA 是 Vue Composition API 的縮寫,它是 Vue 3 推出的新特性,允許開發者以函數式的方式組織組件邏輯。在單文件組件中使用 VCA 語法糖,能讓代碼更加簡潔直觀。

在 Vue 3 的單文件組件中,我們可以直接在<script>標簽內使用 VCA 語法糖,無需額外引入defineComponent。例如:

<template><div><p>{{ message }}</p></div>
</template><script setup>
import { ref } from 'vue';
const message = ref('Hello, Vue 3!');
</script>

在上述代碼中,<script setup>就是 VCA 語法糖的體現。它自動進行了組件的定義,并且在該標簽內聲明的變量和函數可以直接在<template>中使用,無需額外返回。這種寫法減少了樣板代碼,使代碼更加簡潔,邏輯更加清晰。

二、computed:高效的數據處理

computed 屬性用于基于其他響應式數據計算派生數據。它具有緩存機制,只有當依賴的響應式數據發生變化時,才會重新計算。

<template><div><p>原始數字: {{ num }}</p><p>計算后的雙倍數字: {{ doubleNum }}</p></div>
</template><script setup>
import { ref, computed } from 'vue';
const num = ref(5);
const doubleNum = computed(() => num.value * 2);
</script>

在這個例子中,doubleNum是一個 computed 屬性,它依賴于num。當num的值發生變化時,doubleNum會自動重新計算;如果num的值不變,再次訪問doubleNum時會直接返回緩存的結果,從而提高性能。

三、watch:監聽數據變化

watch 用于監聽響應式數據的變化,并在數據變化時執行相應的回調函數。它可以監聽單個數據,也可以監聽多個數據的變化。

<template><div><input v-model="message" /><p>{{ logMessage }}</p></div>
</template><script setup>
import { ref, watch } from 'vue';
const message = ref('');
const logMessage = ref('');
watch(message, (newValue, oldValue) => {logMessage.value = `值從 ${oldValue} 變為 ${newValue}`;
});
</script>

在上述代碼中,watch函數監聽message的變化。當message的值改變時,回調函數會被觸發,更新logMessage的值,從而在頁面上顯示數據變化的信息。

四、props 和 emit:父子組件通信的橋梁

1. props:父組件向子組件傳遞數據

props 用于父組件向子組件傳遞數據。子組件通過定義 props 來接收父組件傳遞的值。

父組件 Parent.vue

<template><div><Child :message="parentMessage" /></div>
</template><script setup>
import Child from './Child.vue';
const parentMessage = '來自父組件的數據';
</script>

子組件 Child.vue

<template><div><p>{{ message }}</p></div>
</template><script setup>
defineProps({message: String
});
</script>

在這個例子中,父組件Parent.vue通過propsparentMessage傳遞給子組件Child.vue,子組件通過定義message屬性接收并使用該數據。

2. emit:子組件向父組件傳遞事件

emit 用于子組件向父組件傳遞事件和數據。子組件通過調用emit方法觸發自定義事件,父組件通過監聽該事件來接收數據。

子組件 Child.vue

<template><div><button @click="sendDataToParent">發送數據</button></div>
</template><script setup>
import { defineEmits } from 'vue';
const emits = defineEmits(['dataSent']);
const sendDataToParent = () => {emits('dataSent', '子組件發送的數據');
};
</script>

父組件 Parent.vue

<template><div><Child @dataSent="handleData" /><p>{{ receivedData }}</p></div>
</template><script setup>
import Child from './Child.vue';
const receivedData = ref('');
const handleData = (data) => {receivedData.value = data;
};
</script>

在這個例子中,子組件Child.vue通過emit觸發dataSent事件,并傳遞數據;父組件Parent.vue通過監聽dataSent事件,在handleData函數中接收并處理子組件傳遞的數據。

五、provide 和 inject:跨層級組件通信的利器

在大型應用中,經常會遇到跨層級組件通信的需求。如果使用 props 和 emit 進行多層級傳遞,會使代碼變得繁瑣。這時,provideinject就派上用場了。

provide用于在祖先組件中提供數據,inject用于在后代組件中注入并使用這些數據。

祖先組件 Grandparent.vue

<template><div><Child /></div>
</template><script setup>
import Child from './Child.vue';
import { provide } from 'vue';
const sharedData = '這是共享數據';
provide('sharedData', sharedData);
</script>

后代組件 Child.vue

<template><div><p>{{ injectedData }}</p></div>
</template><script setup>
import { inject } from 'vue';
const injectedData = inject('sharedData');
console.log(injectedData);
</script>

在這個例子中,祖先組件Grandparent.vue通過provide提供sharedData,后代組件Child.vue通過inject注入并使用該數據,實現了跨層級的組件通信。

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

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

相關文章

【Unity C#從零到精通】項目深化:構建核心游戲循環、UI與動態敵人系統

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

SNR8016語音模塊詳解(STM32)

目錄 一、介紹 二、傳感器原理 1.原理圖 2.引腳描述 三、程序設計 main文件 usart.h文件 usart.c文件 四、實驗效果 五、資料獲取 項目分享 一、介紹 SNR8016語音模塊是智納捷科技生產的一種離線語音識別模塊&#xff0c;設計適合用于DIY領域&#xff0c;開放用戶設…

「動態規劃」線性DP:最長上升子序列(LIS)|編輯距離 / LeetCode 300|72(C++)

概述 DP&#xff0c;即動態規劃是解決最優化問題的一類算法&#xff0c;我們要通過將原始問題分解成規模更小的、相似的子問題&#xff0c;通過求解這些易求解的子問題來計算原始問題。 線性DP是一類基本DP&#xff0c;我們來通過它感受DP算法的奧義。 最長上升子序列&#x…

【NumPy完全指南】從基礎操作到高性能計算實戰

&#x1f4d1; 目錄 一、NumPy核心價值1.1 科學計算現狀分析1.2 ndarray設計哲學 二、核心數據結構解析2.1 ndarray內存布局2.2 數據類型體系 三、矢量化編程實踐3.1 通用函數(ufunc)示例3.2 廣播機制圖解 四、高性能計算進階4.1 內存預分配策略4.2 Cython混合編程 五、典型應用…

你的項目有‘哇‘點嗎?

你的項目有哇點嗎&#xff1f; 刷了一下午招聘軟件&#xff0c;發現沒&#xff1f;大廠JD里總愛寫有創新力者優先——可你們的簡歷&#xff0c;創新力還不如食堂菜單&#xff01; 程序員寫項目最大的誤區&#xff1a;把創新當彩蛋藏最后&#xff01;什么參與需求評審負責模塊…

2025年危化品安全員考試題庫及答案

一、單選題 126.安全生產監督管理部門和負有安全生產監督管理職責的有關部門逐級上報事故情況,每級上報的時間不得超過&#xff08;&#xff09;小時。 A.2 B.6 C.12 答案&#xff1a;A 127.按照《安全生產法》規定,危險化學品生產經營單位的從業人員不服從管理,違反安全生…

第十六屆藍橋杯 C/C++ B組 題解

做之前的真題就可以發現&#xff0c;藍橋杯特別喜歡出找規律的題&#xff0c;但是我還是低估了官方的執念。本博客用于記錄第一次藍橋的過程&#xff0c;代碼寫的很爛&#xff0c;洛谷已經有的題解&#xff0c;這里不再贅述&#xff0c;只說自己遇到的問題。用于以后回顧和查找…

C++ 基于多設計模式下的同步異步?志系統-2項目實現

?志系統框架設計 1.?志等級模塊:對輸出?志的等級進?劃分&#xff0c;以便于控制?志的輸出&#xff0c;并提供等級枚舉轉字符串功能。 ? OFF&#xff1a;關閉 ? DEBUG&#xff1a;調試&#xff0c;調試時的關鍵信息輸出。 ? INFO&#xff1a;提?&#xff0c;普通的提?…

提示詞工程(GOT)把思維鏈推理過程圖結構化

Graph of Thoughts&#xff08;GOT&#xff09;&#xff1f; 思維圖&#xff08;Graph of Thoughts&#xff09;是一種結構化的表示方法&#xff0c;用于描述和組織模型的推理過程。它將信息和思維過程以圖的形式表達&#xff0c;其中節點代表想法或信息&#xff0c;邊代表它們…

登錄github失敗---解決方案

登錄github失敗—解決方案 1.使用 Microsoft Edge 瀏覽器 2.https://www.itdog.cn/dns/ 查詢 github.global.ssl.fastly.net github.com 兩個 域名的 IP 3.修改DNS 為 8.8.8.8 8.8.4.4 4.修改windows hosts 文件 5. 使用 Microsoft Edge 瀏覽器 打開github.com

Spring AOP概念及其實現

一、什么是AOP 全稱Aspect Oriented Programming&#xff0c;即面向切面編程&#xff0c;AOP是Spring框架的第二大核心&#xff0c;第一大為IOC。什么是面向切面編程&#xff1f;切面就是指某一類特定的問題&#xff0c;所以AOP也可以稱為面向特定方法編程。例如對異常的統一處…

強化學習_Paper_2017_Curiosity-driven Exploration by Self-supervised Prediction

paper Link: ICM: Curiosity-driven Exploration by Self-supervised Prediction GITHUB Link: 官方: noreward-rl 1- 主要貢獻 對好奇心進行定義與建模 好奇心定義&#xff1a;next state的prediction error作為該state novelty 如果智能體真的“懂”一個state&#xff0c;那…

spring中的@Configuration注解詳解

一、概述與核心作用 Configuration是Spring框架中用于定義配置類的核心注解&#xff0c;旨在替代傳統的XML配置方式&#xff0c;通過Java代碼實現Bean的聲明、依賴管理及環境配置。其核心作用包括&#xff1a; 標識配置類&#xff1a;標記一個類為Spring的配置類&#xff0c;…

7.計算機網絡相關術語

7. 計算機網絡相關術語 ACK (Acknowledgement) 確認 ADSL (Asymmetric Digital Subscriber Line) 非對稱數字用戶線 AP (Access Point) 接入點 AP (Application) 應用程序 API (Application Programming Interface) 應用編程接口 APNIC (Asia Pacific Network Informatio…

Hadoop 集群基礎指令指南

目錄 &#x1f9e9; 一、Hadoop 基礎服務管理指令 ?? 啟動 Hadoop ?? 關閉 Hadoop &#x1f9fe; 查看進程是否正常運行 &#x1f4c1; 二、HDFS 常用文件系統指令 &#x1f6e0;? 三、MapReduce 作業運行指令 &#x1f4cb; 四、集群狀態監控指令 &#x1f4a1; …

【MySQL數據庫】事務

目錄 1&#xff0c;事務的詳細介紹 2&#xff0c;事務的屬性 3&#xff0c;事務常見的操作方式 1&#xff0c;事務的詳細介紹 在MySQL數據庫中&#xff0c;事務是指一組SQL語句作為一個指令去執行相應的操作&#xff0c;這些操作要么全部成功提交&#xff0c;對數據庫產生影…

一、OrcaSlicer源碼編譯

一、下載 1、OrcaSlicer 2.3.0版本的源碼 git clone https://github.com/SoftFever/OrcaSlicer.git -b v2.3.0 二、編譯 1、在OrcaSlicer目錄運行cmd窗口&#xff0c;輸入build_release.bat 2、如果出錯了&#xff0c;可以多運行幾次build_release.bat 3、在OrcaSlicer\b…

港口危貨儲存單位主要安全管理人員考試精選題目

港口危貨儲存單位主要安全管理人員考試精選題目 1、危險貨物儲存場所的電氣設備應符合&#xff08; &#xff09;要求。 A. 防火 B. 防爆 C. 防塵 D. 防潮 答案&#xff1a;B 解析&#xff1a;港口危貨儲存單位存在易燃易爆等危險貨物&#xff0c;電氣設備若不防爆&…

格雷希爾用于工業氣體充裝站的CZ系列氣罐充裝轉換連接器,其日常維護有哪些

格雷希爾氣瓶充裝連接器&#xff0c;長期用于壓縮氣體的快速充裝和壓縮氣瓶的氣密性檢測&#xff0c;需要進行定期的維護&#xff0c;為每一次的充裝提供更好的連接。下列建議的幾點維護準則適用于格雷希爾所有充注接頭&#xff0c;請非專業人士不要隨意拆卸連接器。 格雷希爾氣…

Java 多線程進階:什么是線程安全?

在多線程編程中&#xff0c;“線程安全”是一個非常重要但又常被誤解的概念。尤其對于剛接觸多線程的人來說&#xff0c;不理解線程安全的本質&#xff0c;容易寫出“偶爾出錯”的代碼——這類 bug 往往隱蔽且難以復現。 本文將用盡可能通俗的語言&#xff0c;從三個角度解釋線…