Vue 3 組件通信全解:從基礎到高級技巧

引言

Vue 3 引入了 Composition API,這為組件通信帶來了新的靈活性和強大的功能。

組件通信基礎

組件的定義和作用

在前端開發中,組件可以被看作是構建用戶界面的獨立單元。它封裝了特定的功能和樣式,可以被重復使用,并且可以獨立于其他部分進行開發和測試。組件的主要作用是提高代碼的復用性、可維護性和可擴展性。通過將界面拆分成多個組件,開發者可以更容易地管理復雜的應用程序,并且可以針對每個組件進行優化,從而提高整體的開發效率和應用性能。

組件樹和父子組件關系

在 Vue.js 這樣的前端框架中,組件可以嵌套使用,形成一個組件樹。在這個樹狀結構中,每個組件都可以有子組件,而這些子組件又可以有自己的子組件,形成一個層級結構。這種結構使得組件之間的關系變得清晰,便于管理和維護。

  • 父子組件關系:在組件樹中,一個組件可以創建另一個組件,這時,創建者被稱為父組件,被創建的組件被稱為子組件。父組件可以向子組件傳遞數據和方法,而子組件可以通過事件向父組件發送信息。這種父子關系是組件通信的基礎。
  • 兄弟組件關系:同一父組件下的多個子組件之間是兄弟組件關系。兄弟組件之間不能直接通信,它們之間的通信通常需要通過父組件來中轉。
  • 祖先和后代組件關系:在組件樹中,父組件的父組件是祖先組件,子組件的子組件是后代組件。這種關系在處理深層嵌套的組件時尤為重要。

組件樹和父子組件關系的概念對于理解組件通信至關重要。掌握這些基礎知識,可以幫助開發者更有效地設計和實現組件間的通信機制。

父子組件通信(Vue 3)

父向子傳遞數據(Props)

什么是 props
Props 是父組件向子組件傳遞數據的一種機制。在 Vue 3 中,使用?defineProps?API 來聲明接收 props,保持了數據的單向流動,確保了組件的獨立性和可重用性。

如何在父組件中傳遞 props
在父組件的模板中,使用?v-bind?或簡寫?:?來綁定數據:

<template><ChildComponent :my-prop="parentData" />
</template>

這里,:my-prop?表示這是一個動態綁定的 prop,parentData?是父組件中定義的數據

如何在子組件中接收 props
在子組件中,使用?defineProps?來聲明接收的 props:

<script setup>
import { defineProps } from 'vue';const props = defineProps({myProp: String
});
</script>

在?<script setup>?語法糖中,defineProps?會自動暴露 props 作為組件的響應式屬性

子向父傳遞事件(Emit)

什么是 emit
Emit 是子組件向父組件發送消息的一種機制。在 Vue 3 中,使用?defineEmits?API 來聲明可以發出的事件,并使用?emit?函數來觸發事件。

如何在子組件中觸發事件
在子組件的方法中,使用?defineEmits?來聲明可以發出的事件,并使用?emit?來觸發:

<script setup>
import { defineEmits } from 'vue';const emit = defineEmits(['my-event']);function triggerEvent() {emit('my-event', dataToPass);
}
</script>

defineEmits?用于聲明組件可以發出的事件,而?emit?函數用于觸發這些事件。

如何在父組件中監聽子組件的事件
在父組件的模板中,使用?v-on?或簡寫?@?來監聽子組件發出的事件:

<template><ChildComponent @my-event="handleEvent" />
//或者<ChildComponent v-on:my-event="handleEvent" />
</template>

這里,@my-event?表示監聽子組件發出的?my-event?事件,handleEvent?是父組件中定義的方法,當事件被觸發時,這個方法將被調用。

綜合示例

假設有一個父組件?ParentComponent?和一個子組件?ChildComponent,父組件需要向子組件傳遞數據,并且子組件需要在特定操作后通知父組件。

父組件?ParentComponent.vue

<template><ChildComponent :my-prop="parentData" @child-event="handleChildEvent" />
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const parentData = ref('initial data');
const handleChildEvent = (data) => {console.log('Received data from child:', data);
};
</script>

子組件?ChildComponent.vue

<template><button @click="sendDataToParent">Send Data to Parent</button>
</template><script setup>
import { defineProps, defineEmits } from 'vue';const props = defineProps({myProp: String
});const emit = defineEmits(['child-event']);function sendDataToParent() {emit('child-event', props.myProp);
}
</script>

在這個示例中,父組件通過?:my-prop?向子組件傳遞數據,并通過?@child-event?監聽子組件發出的事件。子組件通過?defineProps?接收父組件傳遞的?myProp,并在按鈕點擊事件中使用?emit?向父組件發送數據。

使用 Pinia(Vue 3 的狀態管理庫)

Pinia 的優勢和特點

Pinia 是 Vue 3 官方推薦的狀態管理庫,它提供了一種組件式的方式來管理應用狀態。以下是 Pinia 的一些主要優勢和特點:

  • 組件式 API:Pinia 采用組件式 API,使得狀態管理與組件邏輯的分離更加自然。
  • TypeScript 支持:Pinia 從一開始就考慮了 TypeScript 的支持,使得在使用 TypeScript 開發時能夠獲得更好的類型推斷和編輯器支持。
  • 模塊化:Pinia 允許你將狀態分割成多個 store,每個 store 可以獨立管理自己的狀態和邏輯。
  • 組合式 API 兼容:Pinia 與 Vue 3 的 Composition API 完美集成,使得狀態管理與組件邏輯的分離更加自然。
  • 時間旅行調試:Pinia 提供了時間旅行調試功能,允許開發者輕松地回溯和檢查狀態變化。
如何設置和使用 Pinia

要開始使用 Pinia,首先需要安裝 Pinia:

npm install pinia

或者使用 Yarn:

yarn add pinia

然后,在你的 Vue 應用中設置 Pinia:

import { createPinia } from 'pinia';const pinia = createPinia();
app.use(pinia);

創建一個 store:

import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', () => {const count = ref(0);function increment() {count.value++;}return { count, increment };
});

在組件中使用 store:

<script setup>
import { useCounterStore } from '@/stores/counter';const counterStore = useCounterStore();
</script><template><div><p>Count: {{ counterStore.count }}</p><button @click="counterStore.increment">Increment</button></div>
</template>
Pinia 與組件的集成

Pinia 與組件的集成非常簡單,主要通過?defineStore?函數來創建 store。在組件中,你可以直接使用 store 中的狀態和方法:

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script setup>
import { useCounterStore } from '@/stores/counter';const counterStore = useCounterStore();
const { count, increment } = storeToRefs(counterStore);
//如果這里不使用storeToRefs會丟失響應式特性
</script>

在上面的例子中,我們直接在模板中訪問?count?來顯示計數器的值,并在按鈕點擊事件中調用?increment?方法來增加計數器的值。

Vue 3 特有的通信方式

Provide/Inject

Provide/Inject 的基本用法
在 Vue 3 中,provide?和?inject?是一種父子組件間通信的方式,允許一個祖先組件向其所有子孫組件注入一個依賴,而不論組件層次有多深。

  • 提供數據:祖先組件使用?provide?函數提供數據。
  • 注入數據:子孫組件使用?inject?函數注入數據。

Provide/Inject 的適用場景
provide?和?inject?適用于以下場景:

  • 當你希望避免通過多層?props?傳遞數據時。
  • 當你希望組件樹中的多個組件共享數據時。

示例代碼

// 祖先組件
export default {setup() {const message = 'Hello from Ancestor!';provide('message', message);}
}// 子孫組件
export default {setup() {const message = inject('message');return { message };}
}
Teleport

Teleport 的概念和用途
Teleport?是 Vue 3 新增的一個內置組件,它允許你將一個組件內部的一部分模板“傳送”到 DOM 中的任何其他位置。

如何使用 Teleport 進行組件通信
Teleport?本身不是用來進行組件間通信的,而是用來控制組件渲染位置的。但你可以利用?Teleport?將組件的某些部分渲染到父組件的 DOM 中,從而實現一種特殊的通信方式。

示例代碼

<!-- 父組件 -->
<template><div><Teleport to="body"><ChildComponent /></Teleport></div>
</template><!-- 子組件 -->
<template><div>Some content</div>
</template>
Composition API

Composition API 的介紹
Vue 3 引入了 Composition API,它提供了一種新的方式來組織和重用邏輯。通過?setup?函數,開發者可以更靈活地控制組件的響應式狀態和生命周期。

使用 ref 和 reactive 進行組件間通信
ref?和?reactive?是 Composition API 中用于創建響應式數據的工具。

  • ref?用于創建基本數據類型的響應式引用。
  • reactive?用于創建對象類型的響應式引用。

使用 provide 和 inject 在 Composition API 中
在 Composition API 中,provide?和?inject?可以在?setup?函數中使用,以實現跨組件的通信。

示例代碼

// 祖先組件
import { provide } from 'vue';export default {setup() {const message = ref('Hello from Ancestor!');provide('message', message);}
}// 子孫組件
import { inject } from 'vue';export default {setup() {const message = inject('message');return { message };}
}

通過這些 Vue 3 特有的通信方式,開發者可以更加靈活地組織組件間的通信,提高代碼的可維護性和可重用性。

總結

Vue 3 引入了 Composition API,為組件通信帶來了新的靈活性和強大的功能。組件通信是前端開發中構建復雜用戶界面的關鍵,它涉及父子組件、兄弟組件以及祖先和后代組件之間的數據傳遞和事件觸發。Vue 3 提供了多種通信方式,包括傳統的 props 和 emit,以及新增的 Provide/Inject、Teleport 和 Composition API。

相關資料推薦

  • Vue 3 官方文檔:Vue.js - The Progressive JavaScript Framework | Vue.js?- 官方文檔是學習 Vue 3 最權威的資源,包含了詳細的指南和 API 參考。
  • Vue.js 3 Composition API 教程:Composition API FAQ | Vue.js?- 官方提供的 Composition API 教程,幫助你快速上手。
  • Pinia 官方文檔:Pinia | The intuitive store for Vue.js?- 如果你打算使用 Pinia 進行狀態管理,Pinia 的官方文檔是最佳學習資源。
  • Vue.js 技術揭秘:前言 | Vue.js 技術揭秘?- 這是一個深入分析 Vue.js 內部機制的項目,有助于理解 Vue 的工作原理。

創作不易,如果這篇文章有幫助到你,給個點贊可以嗎

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

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

相關文章

【數據結構——鏈表的深度探索】從實現到應用,保姆級攻略

【數據結構——鏈表深度探索】從實現到應用&#xff0c;保姆級攻略 &#x1f341;1. 鏈表的介紹&#x1f341;2. 鏈表的實現&#x1f341;2.1 單向鏈表&#x1f341;2.1.1 size()&#x1f341;2.1.2 display()&#x1f341;2.1.3 contains(int key)&#x1f341;2.1.4 addFirst…

墨西哥:海外新聞稿媒體分發-海外pr發稿干貨分享-大舍傳媒

大舍傳媒&#xff1a;海外新聞稿媒體分發平臺 墨西哥觀查者 (mexicoviewer) 墨西哥觀查者是墨西哥一家知名的新聞媒體平臺&#xff0c;該平臺專注于報道墨西哥國內外的時事新聞、政治、經濟、文化等多個領域的內容。其更新速度快&#xff0c;報道對象廣泛&#xff0c;深受墨西…

微信小程序---模板語法

一、聲明和綁定數據 小程序頁面中使用的數據均需要在 Page() 方法的 data 對象中進行聲明定義 在將數據聲明好以后&#xff0c;需要在 WXML 中綁定數據&#xff0c;數據綁定最簡單的方式是使用 Mustache 語法&#xff08;雙大括號&#xff09;將變量包起來。 在 {{ }} 內部可…

開始性能測試之前的準備工作!

性能測試是軟件測試中不可或缺的一部分&#xff0c;它可以幫助我們評估軟件系統的性能表現&#xff0c;并找出潛在的性能瓶頸。在進行性能測試之前&#xff0c;需要做好充分的準備工作&#xff0c;以確保測試的有效性和準確性。 1. 確定性能測試的目標和范圍 * 明確測試目標:性…

《數據庫原理》SQLServer期末復習_題型+考點

目錄 題型&#xff1a; 一. 概況分析題&#xff08;5小題&#xff0c;每小題2分&#xff0c;共10分&#xff09; 二. 計算題&#xff08;3小題&#xff0c;每小題5分&#xff0c;共15分&#xff09; 三. 數據庫設計&#xff08;2小題&#xff0c;每小題10分&#xff0c;共2…

什么是數組,什么是對象,并說出他們的區別

數組就是一組數據的集合。 對象就是用來儲存變量的。 創建方式不同&#xff1a; 對象可以通過new關鍵字創建對象&#xff0c;或者通過對象字面量創建 數組&#xff1a;new Array() 數組表 示有序數據的集合&#xff0c;而對象表示無序數據的集合 數組的數據沒有名稱&#xff08…

在mysql中delete和truncated的相同點和區別點

相同點 刪除數據&#xff1a;兩者都會刪除表中的數據。影響數據&#xff1a;兩者都不刪除表結構&#xff0c;只影響表中的數據。 區別點 操作方式&#xff1a; DELETE&#xff1a;逐行刪除數據&#xff0c;可以使用 WHERE 子句來指定刪除的條件。如果不加 WHERE 子句&#…

Spring Boot(八十):Tesseract實現圖片文字自動識別

1Tesseract 要實現圖片轉文字(OCR,Optical Character Recognition)功能,可以使用一些現有的OCR庫,比如Google的Tesseract或者百度AI、阿里云OCR等云服務。 下面以Tesseract為例: Tesseract是一個開源文本識別 (OCR)引擎,是目前公認最優秀、最精確的開源OCR系統,用于…

【Python機器學習】處理文本數據——用tf-idf縮放數據

為了按照我們預計的特征信息量大小來縮放特征&#xff0c;而不是舍棄那些認為不重要的特征&#xff0c;最常見的一種做法就是使用詞頻-逆向文檔頻率&#xff08;tf-idf&#xff09;。這一方法對某個特定文檔中經常出現的術語給與很高的權重&#xff0c;但是堆在語料庫的許多文檔…

作業/數據結構/2023/7/10

1.實現單向鏈表隊列的&#xff0c;創建&#xff0c;入隊&#xff0c;出隊&#xff0c;遍歷&#xff0c;長度&#xff0c;銷毀。 main.c #include "head.h"int main(int argc, const char *argv[]) {//創建鏈式隊列queue_ptr QLcreate_queue();//入棧push(QL, 1000)…

imx6ull/linux應用編程學習(16)emqx ,mqtt創建連接mqtt.fx

在很多項目中都需要自己的私人服務器&#xff0c;以保證數據的隱私性&#xff0c;這里我用的是emqx。 1.進入emqx官網 EMQX&#xff1a;用于物聯網、車聯網和工業物聯網的企業級 MQTT 平臺 點擊試用cloud 申請成功后可得&#xff1a;&#xff08;右邊的忽略&#xff09; 進入…

告別PS,ChatGPT圖片局部修改,手把手教你成為畫圖高手

大家好&#xff0c;我是YUAN&#xff01; 今天&#xff0c;我要向大家介紹一個能夠點燃創意火花的畫圖設計神器——DALLE編輯器。讓藝術創作&#xff0c;尤其是畫圖變得更加簡單、直觀&#xff0c;甚至可以說是革命性的。 DALLE是什么&#xff1f; DALLE編輯器的問世&#xf…

macOS系統下載navicat安裝包

鏈接: https://pan.baidu.com/s/1SqTIXNL-B8ZMJxIBu1DfIw?pwdc1z8 提取碼: c1z8 安裝后效果

buuctf題目講解-1

一眼就解密 ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 flag{THEFLAGOFTHISSTRING} base家族 base64 加密原理&#xff1a; 明文&#xff1a;abc 去找ascii碼的二進制形式 a-->97-→01100001 &#xff08;二進制為8位如果不足8位則在最左邊補0至8位&#xff09; b-→…

生物環保的技術原理和優點是什么

生物環保的技術原理和優點可以歸納如下&#xff1a; 技術原理 生物環保利用生物學原理&#xff0c;采用生物技術&#xff0c;通過生物過程來凈化環境&#xff0c;消除污染物&#xff0c;減少污染源&#xff0c;從而改善環境質量。這主要依賴于微生物的代謝活動、生長特性和相…

05STM32EXIT外部中斷中斷系統

STM32EXIT外部中斷&中斷系統 中斷系統中斷觸發條件&#xff1a;中斷處理流程和用途&#xff1a; STM32中斷NVIC嵌套中斷向量控制器基本結構 中斷系統 中斷觸發條件&#xff1a; 對外部中斷來說&#xff0c;可以是引腳發生了電平跳變 對定時器來說&#xff0c;可以是定時的…

算法系列--鏈表問題

一.一些經驗總結 鏈表天然具有遞歸性質,單鏈表可以看做一個單叉樹,很多可以應用到二叉樹的題目也可以應用到鏈表的題目之中,下面是一個體現單鏈表遞歸性質很好的例子逆序打印鏈表的值 private void reversePrint(ListNode head) {if(head null) return;reversePrint(head.ne…

速盾:cdn節點作用?

CDN&#xff08;Content Delivery Network&#xff09;指的是內容分發網絡&#xff0c;是一種通過部署在全球不同地理位置的服務器節點來提供快速、高效的內容傳輸和分發的技術架構。CDN節點在網絡中的作用非常重要&#xff0c;下面就對其作用進行詳細解析。 提供高速內容傳輸&…

《算法筆記》總結No.6——貪心

一.簡單貪心 貪心法是求解一類最優化問題的方法&#xff0c;它總是考慮在當前狀態下局部最優(或較優)之后&#xff0c;來使全局的結果達到最優(或較優)的策略。顯然&#xff0c;如果采取較優而非最優的策略(最優策略可能不存在或是不易想到)&#xff0c;得到的全局結果也無法是…

socketserver和WSGI服務端實現教程

Python socketserver 和 WSGI 服務端實現教程 在本文中&#xff0c;我們將詳細解析一個使用 socketserver 模塊實現的簡單 WSGI 服務器。該服務器能夠處理 HTTP 請求&#xff0c;支持 WSGI 應用&#xff0c;并正確處理響應頭和錯誤。 代碼概述 這段代碼定義了一個 run_wsgi …