【Vue3知識】組件間通信的方式

組件間通信的方式

    • 概述
      • **1. 父子組件通信**
        • **父組件向子組件傳遞數據(Props)**
        • **子組件向父組件發送事件(自定義事件)**
      • **2. 兄弟組件通信**
        • **通過父組件中轉**
        • **使用全局狀態管理(如 Pinia 或 Vuex)**
      • **3. 跨層級組件通信**
        • **使用 Provide/Inject**
        • **使用全局事件總線(不推薦)**
      • **4. 使用 Vue Router 的參數**
      • **總結**
    • 關聯知識

概述

在 Vue 3 中,組件間通信是一個常見且重要的需求。Vue 3 提供了多種方式來實現組件間的通信,根據組件的關系(父子組件、兄弟組件、跨層級組件等)和具體需求,可以選擇不同的通信方式。以下是一些常用的組件間通信方法:

1. 父子組件通信

父組件向子組件傳遞數據(Props)
  • 使用 props:父組件通過 props 向子組件傳遞數據。

  • 示例

    <!-- ParentComponent.vue -->
    <template><ChildComponent :message="parentMessage" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentMessage: 'Hello from Parent',};},
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: {message: {type: String,required: true,},},
    };
    </script>
    
子組件向父組件發送事件(自定義事件)
  • 使用 $emit:子組件通過 $emit 觸發事件,父組件監聽該事件并處理。

  • 示例

    <!-- ParentComponent.vue -->
    <template><ChildComponent @update="handleUpdate" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleUpdate(newMessage) {console.log('Received from child:', newMessage);},},
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><button @click="sendMessage">Send Message</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('update', 'Hello from Child');},},
    };
    </script>
    

2. 兄弟組件通信

兄弟組件之間沒有直接的通信機制,通常通過共同的父組件或狀態管理工具實現。

通過父組件中轉
  • 父組件作為中介:兄弟組件通過父組件傳遞數據或事件。

  • 示例

    <!-- ParentComponent.vue -->
    <template><SiblingOne @send-to-sibling="handleSiblingOneMessage" /><SiblingTwo :message="siblingTwoMessage" />
    </template><script>
    import SiblingOne from './SiblingOne.vue';
    import SiblingTwo from './SiblingTwo.vue';export default {components: { SiblingOne, SiblingTwo },data() {return {siblingTwoMessage: '',};},methods: {handleSiblingOneMessage(message) {this.siblingTwoMessage = message;},},
    };
    </script>
    
    <!-- SiblingOne.vue -->
    <template><button @click="sendMessage">Send to Sibling Two</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('send-to-sibling', 'Hello from Sibling One');},},
    };
    </script>
    
    <!-- SiblingTwo.vue -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: {message: {type: String,default: '',},},
    };
    </script>
    
使用全局狀態管理(如 Pinia 或 Vuex)
  • Pinia:Vue 3 推薦的狀態管理庫,用于管理全局狀態。

  • 示例

    # 安裝 Pinia
    npm install pinia
    
    // store.js
    import { defineStore } from 'pinia';export const useMainStore = defineStore('main', {state: () => ({sharedMessage: '',}),actions: {setMessage(message) {this.sharedMessage = message;},},
    });
    
    <!-- SiblingOne.vue -->
    <template><button @click="sendMessage">Send to Sibling Two</button>
    </template><script>
    import { useMainStore } from './store';export default {setup() {const store = useMainStore();const sendMessage = () => {store.setMessage('Hello from Sibling One');};return { sendMessage };},
    };
    </script>
    
    <!-- SiblingTwo.vue -->
    <template><div>{{ sharedMessage }}</div>
    </template><script>
    import { computed } from 'vue';
    import { useMainStore } from './store';export default {setup() {const store = useMainStore();const sharedMessage = computed(() => store.sharedMessage);return { sharedMessage };},
    };
    </script>
    

3. 跨層級組件通信

使用 Provide/Inject
  • provideinject:Vue 3 提供的 API,用于在組件樹中跨層級傳遞數據。

  • 示例

    <!-- GrandParentComponent.vue -->
    <template><ParentComponent />
    </template><script>
    import { provide } from 'vue';
    import ParentComponent from './ParentComponent.vue';export default {components: { ParentComponent },setup() {provide('sharedData', 'Hello from GrandParent');},
    };
    </script>
    
    <!-- ParentComponent.vue -->
    <template><ChildComponent />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><div>{{ injectedData }}</div>
    </template><script>
    import { inject } from 'vue';export default {setup() {const injectedData = inject('sharedData');return { injectedData };},
    };
    </script>
    
使用全局事件總線(不推薦)
  • 事件總線:通過一個空的 Vue 實例作為事件總線,在組件間發送和接收事件。
  • 缺點:不推薦在 Vue 3 中使用,因為會導致組件間耦合度增加,難以維護。

4. 使用 Vue Router 的參數

  • 路由參數:通過路由參數在組件間傳遞數據。

  • 示例

    // router/index.js
    import { createRouter, createWebHistory } from 'vue-router';
    import ComponentA from './ComponentA.vue';
    import ComponentB from './ComponentB.vue';const routes = [{ path: '/component-a', component: ComponentA },{ path: '/component-b/:message', component: ComponentB },
    ];const router = createRouter({history: createWebHistory(),routes,
    });export default router;
    
    <!-- ComponentA.vue -->
    <template><button @click="navigateToB">Go to Component B</button>
    </template><script>
    import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();const navigateToB = () => {router.push({ path: '/component-b/Hello from Component A' });};return { navigateToB };},
    };
    </script>
    
    <!-- ComponentB.vue -->
    <template><div>{{ $route.params.message }}</div>
    </template>
    

總結

  • 父子組件:使用 props$emit
  • 兄弟組件:通過父組件中轉或使用狀態管理工具。
  • 跨層級組件:使用 provide/inject
  • 全局狀態:使用 Pinia 或 Vuex。
  • 路由參數:通過 Vue Router 傳遞參數。

選擇合適的通信方式可以提高代碼的可維護性和可擴展性。在 Vue 3 中,推薦優先使用 props$emitprovide/inject,并在需要全局狀態管理時使用 Pinia。

關聯知識

【Vue3知識】Vue3父子組件間數據通信

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

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

相關文章

[藍橋杯] 挖礦(CC++雙語版)

題目鏈接 P10904 [藍橋杯 2024 省 C] 挖礦 - 洛谷 題目理解 我們可以將這道題中礦洞的位置理解成為一個坐標軸&#xff0c;以題目樣例繪出坐標軸&#xff1a; 樣例&#xff1a; 輸入的5為礦洞數量&#xff0c;4為可走的步數。第二行輸入是5個礦洞的坐標。輸出結果為在要求步數…

2025年Python的主要應用場景

李升偉 編譯 Python在2025年仍是最受歡迎和強大的編程語言之一。其簡潔易讀的語法以及龐大的庫生態系統&#xff0c;使其成為各行業開發者的首選。無論是構建復雜的數據管道&#xff0c;還是自動化重復性任務&#xff0c;Python都能提供廣泛的應用場景&#xff0c;以實現快速、…

fastapi完全離線環境(無外網)的訪問Swagger所做特殊處理

在互聯網環境中&#xff0c;只要 啟動FastAPI 服務運行在本地機器上&#xff0c;訪問 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以訪問到Swagger界面&#xff0c;但是在完全離線環境&#xff08;無外網&#xff09;下如何訪問Swagger頁面呢&#xff1…

Ubuntu 20.04 出現問號圖標且無法聯網 修復

在 Ubuntu 中遇到網絡連接問題&#xff08;如出現問號圖標且無法聯網&#xff09;&#xff0c;可以通過以下命令嘗試重啟網絡服務&#xff1a; 1. 推薦先修改DNS 編輯 -> 虛擬機網絡編輯器-> VMnet8 ->NAT 設置 -> DNS 設置 -> 設置DNS 服務器 DNS填什么 取決…

哈希表(開散列)的實現

目錄 引入 開散列的底層實現 哈希表的定義 哈希表的擴容 哈希表的插入 哈希表查找 哈希表的刪除 引入 接上一篇&#xff0c;我們使用了閉散列的方法解決了哈希沖突&#xff0c;此篇文章將會使用開散列的方式解決哈希沖突&#xff0c;后面對unordered_set和unordered_map的…

機器學習(八):K-Means聚類原理與實戰

聲明&#xff1a;未經允許禁止轉載與抄襲。 前言 k k k均值&#xff08; k k k-means&#xff09;聚類算法是一種經典的無監督聚類算法&#xff0c;本文將深入解析其理論原理&#xff0c;并在真是數據集上進行算法實踐&#xff0c;話不多說&#xff0c;請看下文。 算法原理 …

判斷矩陣A和矩陣B是否相似?

【例題1】 &#xff08;1&#xff09;方法1 &#xff08;2&#xff09;方法2 &#xff08;3&#xff09;方法3 好題\(^o^)/~ 【注意】當二次多項式有重根時&#xff0c;即判別式為零&#xff0c;此時二次多項式是完全平方。

【10】搭建k8s集群系列(二進制部署)之安裝Dashboard和CoreDNS

一、部署Dashboard 1.1、創建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大數據技術與Scala

集合高級函數 過濾 通過條件篩選集合元素&#xff0c;返回新集合。 映射 對每個元素應用函數&#xff0c;生成新集集合 扁平化 將嵌套集合展平為單層集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分組 按規則將元素分組為Map結構。 歸約 …

數據驅動可視化實戰:圖表狐精準生成圖表的完整數據范式

一、數據輸入黃金法則 圖表狐 - AI圖表生成工具,在線數據可視化要求數據描述必須包含三個核心要素&#xff1a; [主體對象] [量化指標] [維度劃分] 錯誤示例 ?&#xff1a; "展示各部門銷售額對比" 正確示例 ?&#xff1a; "2023年Q1-Q4各部門銷售額&a…

蒼穹外賣(1)-部分環境配置(git、數據庫)

首先配置git 創建好本地倉庫之后 把項目弄到遠程倉庫里去 先進行提交 &#xff0c;后進行推送 &#xff0c;然后gitee創建一個倉庫 把這個url復制好 推送后會出來一個 點擊推送&#xff0c;會讓你輸入gitee賬號密碼&#xff0c;輸入自己的賬號密碼&#xff0c;就可以連接遠程倉…

Ubunut18.04 離線安裝MySQL 5.7.35

一、環境準備 1.1 官方下載MySQL5.7.35 完整包 1.2 上傳包 & 解壓 上傳包名稱是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切換到上傳目錄 cd /home/MySQL # 解壓&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc編譯

本例子摘自《鳥哥的linux私房菜-基礎學習第四版》 21.3 用make進行宏編譯 書中的代碼在本機器(版本見下&#xff09;編譯出錯&#xff0c;改正代碼后發布此文章&#xff1a; #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…

MCP+Blender創建電力塔

MCP&#xff08;Model Context Protocol&#xff09;與Blender的結合是當前AI與3D建模領域的熱門技術&#xff0c;它通過協議化的方式讓Claude等AI模型直接控制Blender&#xff0c;實現自動化3D建模。 1. 功能與原理 ? 核心能力&#xff1a;用戶通過自然語言指令&#xff08;…

Qt與C++數據類型轉換

本文深入探討Qt與C中相似但不同的數據類型處理技巧。 一、QString與std::string的相互轉換 1. QString → std::string 方法1&#xff1a;使用toStdString()&#xff08;推薦&#xff09; QString qstr "你好&#xff0c;Qt世界"; std::string str qstr.toStdS…

機器學習+EEG熵進行雙相情感障礙診斷的綜合評估

摘要 雙相情感障礙(BD)是一種常見的精神疾病&#xff0c;特點是躁狂或輕躁狂與抑郁交替發作&#xff0c;其嚴重程度各異&#xff0c;導致準確及時的診斷具有一定的挑戰性。EEG的非線性特征被認為是精神障礙的生物標志物&#xff0c;能夠反映大腦的非線性動態。盡管已有研究證明…

企業應用集成全析:架構、實踐與展望

企業應用集成全析&#xff1a;架構、實踐與展望 一、企業應用集成的基本概念1.1 定義1.2 目標 二、企業應用集成的層次架構2.1 數據集成2.2 應用系統集成2.3 業務流程集成? 三、企業應用集成的關鍵技術3.1 中間件技術3.2 Web 服務技術?3.3 企業服務總線&#xff08;ESB&#…

【STL】list介紹(附與vector的比較)

文章目錄 1.關于list2.使用2.1 list的構造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素訪問2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱狀圖

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

SQL:DDL(數據定義語言)和DML(數據操作語言)

目錄 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;數據定義語言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;數據操作語言&#xff09; DDL和DML的區別 什么是SQL&#xff1f; SQL&#xff08;Structured …