Vue3中的常見組件通信之mitt

Vue3中的常見組件通信之mitt

概述

? 在vue3中常見的組件通信有props、mitt、v-model、 r e f s 、 refs、 refsparent、provide、inject、pinia、slot等。不同的組件關系用不同的傳遞方式。常見的撘配形式如下表所示。

組件關系傳遞方式
父傳子1. props
2. v-model
3. $refs
4. 默認插槽、具名插槽
子傳父1. props
2. 自定義事件
3. v-model
4. $parent
5. 作用域插槽
祖傳孫、孫傳祖1. $attrs
2. provide、inject
兄弟間、任意組件間1. mitt
2. pinia

? props和自定義事件詳見本人另一篇文章:
Vue3中的常見組件通信之props和自定義事件
下面接著上文來繼續記錄mitt的用法。

3.mitt

mitt與pubsub訂閱消息與發布消息功能類似,它可以實現在任意組件間的通信。

3.1安裝mitt及引入mitt

mitt需要安裝,在終端中輸入命令npm i mitt來安裝。

mitt安裝好之后按照工程化的管理需要在src的文件下新建文件夾utils,然后在utils文件夾中新建文件emitter.ts。

在emitter.ts文件中引入mitt,并創建emitter,同時暴露emitter,如下代碼:

//引入mitt
import mitt from 'mitt'//調用mitt,得到emitter,emitter可以綁定事件和觸發事件
const emitter = mitt()//暴露emitter
export default emitter

之后需要再在main.ts中引入emitter,如下代碼:

import emitter from '@/utils/emitter'

3.2 emitter基本用法

emitter身上有四個方法,分別是

  • **on()😗*用來綁定事件,接收兩個參數,第一個參數是事件名,第二個參數是事件觸發時的回調函數;
  • **emit()😗*用來觸發事件,參數為事件名;
  • **off()😗*用來解綁事件,參數為事件名;
  • **all:**all有clear屬性,直接調用clear()屬性可以解綁全部事件。

以下代碼為展示emitter的基本用法:

//綁定事件test1,當事件觸發時執行回調
emitter.on('test1',()=>{console.log('test1被調用了')
})//綁定事件test2,當事件觸發時執行回調
emitter.on('test2',()=>{console.log('test2被調用了')
})//綁定事件test3,當事件觸發時執行回調
emitter.on('test3',()=>{console.log('test3被調用了')
})//觸發事件,每間隔1秒觸發一次
setInterval(()=>{//觸發事件test1emitter.emit('test1')//觸發事件test2emitter.emit('test2')//觸發事件test3emitter.emit('test3')
},1000)//解綁事件,2秒后解綁test1
setTimeout(()=>{emitter.off('test1')console.log('--------test1解綁了')
},2000)//解綁事件,4秒后解綁所有事件
setTimeout(()=>{emitter.all.clear()console.log('--------所有的事件解綁了')
},4000)

運行后在控制臺輸出如下內容:

image-20240602215320240

3.3emitter在組件中的用法

首先創建一個父組件,兩個子組件,父組件代碼如下:

<template><div class="father"><h3>父組件</h3><Child1/><Child2/></div>
</template><script setup lang="ts" name="Father">import Child1 from './Child1.vue'import Child2 from './Child2.vue'
</script><style scoped>.father{margin: 5px;background-color:rgb(79, 186, 111);padding: 20px;color: white;}
</style>

子組件1代碼:

<template><div class="child1"><h3>子組件1</h3></div>
</template><script setup lang="ts" name="Child1"></script><style scoped>.child1{margin: 5px;background-color: rgba(7, 7, 7, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #760e0e;}	
</style>

子組件2代碼:

<template><div class="child2"><h3>子組件2</h3></div>
</template><script setup lang="ts" name="Child2"></script><style scoped>.child2{margin: 5px;background-color: rgba(255, 255, 255, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #05035f;}	
</style>

運行效果如下:

image-20240602221333262

然后我們在子組件1中準備一些數據如下:

//數據
let book = reactive({name:'西游記',author:'吳承恩',price:119.95
})

然后在頁面中展示:

<!-- 展示 -->
<h4>圖書名稱:{{ book.name }}</h4>
<h4>圖書作者:{{ book.author }}</h4>
<h4>圖書價格:¥{{ book.price }}</h4>

運行效果如下:

image-20240603204353377

接下來在子組件2中引入emitter,然后創建book數據,給emitter綁定事件,并傳入回調函數:

//引入emitterimport emitter from '@/utils/emitter';import { reactive } from 'vue';//數據let book = reactive({name:'',author:'',price:null})//給emitter綁定getBook事件,傳入回調函數,回調函數接收一個參數emitter.on('getBook',(value:any)=>{// console.log(value)book.name = value.namebook.author = value.authorbook.price = value.price})

然后在子組件1中創建一個按鈕,綁定click事件,觸發getBook事件,并傳遞book參數:

<button @click="emitter.emit('getBook',book)">將book信息發送給子組件2</button>

最后在子組件2中展示接收的到的信息:

	<!-- 展示 --><h4>圖書名稱:{{ book.name }}</h4><h4>圖書作者:{{ book.author }}</h4><h4>圖書價格:¥{{ book.price }}</h4>

最后運行后頁面效果如下:

image-20240603205650064

點擊按鈕后效果如下:

image-20240603205727565

至此已經完成了子組件1向子組件2通信。

子組件1完整代碼如下:

<template><div class="child1"><h3>子組件1</h3><!-- 展示 --><h4>圖書名稱:{{ book.name }}</h4><h4>圖書作者:{{ book.author }}</h4><h4>圖書價格:¥{{ book.price }}</h4><button @click="emitter.emit('getBook',book)">將book信息發送給子組件2</button></div>
</template><script setup lang="ts" name="Child1">import emitter from '@/utils/emitter';import { reactive } from 'vue';//數據let book = reactive({name:'西游記',author:'吳承恩',price:119.95})
</script><style scoped>.child1{margin: 5px;background-color: rgba(7, 7, 7, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #760e0e;}	
</style>

子組件2 的完整代碼如下:

<template><div class="child2"><h3>子組件2</h3><!-- 展示 --><h4>圖書名稱:{{ book.name }}</h4><h4>圖書作者:{{ book.author }}</h4><h4>圖書價格:¥{{ book.price }}</h4></div>
</template><script setup lang="ts" name="Child2">//引入emitterimport emitter from '@/utils/emitter';import { reactive } from 'vue';//數據let book = reactive({name:'',author:'',price:null})//給emitter綁定getBook事件,傳入回調函數,回調函數接收一個參數emitter.on('getBook',(value:any)=>{// console.log(value)book.name = value.namebook.author = value.authorbook.price = value.price})
</script><style scoped>.child2{margin: 5px;background-color: rgba(255, 255, 255, 0.224);border: 1px solid;border-color: white;box-shadow: 0 0 5px;padding: 10px;color: #05035f;}	
</style>

3.4 小結

接收數據的組件必須要先綁定事件(訂閱),發送數據的組件要觸發事件,只要組件中引入了emitter,并執行了emitter.emit()代碼并傳遞參數,即可實現任意組件間的通信。

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

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

相關文章

用例篇03

正交表 因素&#xff1a;存在的條件 水平&#xff1a;因素的取值 最簡單的正交表&#xff1a;L4(2) 應用 allpairs 來實現正交表。 步驟&#xff1a; 1.根據需求找出因素和水平 2.將因素和水平寫入到excel表格中&#xff08;表格不需要保存&#xff09;&#xff08;推薦用…

SpaceX 首席火箭著陸工程師 MIT論文詳解:非凸軟著陸最優控制問題的控制邊界和指向約束的無損凸化

上一篇blog翻譯了 Lars Blackmore(Lars Blackmore is principal rocket landing engineer at SpaceX)的文章&#xff0c;SpaceX 使用 CVXGEN 生成定制飛行代碼,實現超高速機載凸優化。利用地形相對導航實現了數十米量級的導航精度,著陸器在著陸過程中成像行星表面并將特征與機載…

PHP序列化、反序列化

目錄 一、PHP序列化&#xff1a;serialize() 1.對象序列化 2.pop鏈序列化 3.數組序列化 二、反序列化&#xff1a;unserialize() 三、魔術方法 ?四、NSSCTF相關簡單題目 1.[SWPUCTF 2021 新生賽]ez_unserialize 2.[SWPUCTF 2021 新生賽]no_wakeup 學習參考&#xff1…

054、Python 函數的概念以及定義

編程大師Martin Fowler曾說過&#xff1a;“代碼有很多種壞味道&#xff0c;重復是最壞的一種。” 那么遇到重復的代碼&#xff0c;如何做&#xff1f;答案就是&#xff1a;函數。 函數就是把重復的代碼封裝在一起&#xff0c;然后通過調用該函數從而實現在不同地方運行同樣的…

解決MAC M1 Docker Desktop啟動一直在starting

問題描述&#xff1a; 今天使用docker buildx 構建Multi-platform&#xff0c;提示如下錯誤&#xff1a; ERROR: Multi-platform build is not supported for the docker driver. Switch to a different driver, or turn on the containerd image store, and try again. 于是按…

蘋果ios用戶下載ipa文件內測簽名的后的app應用下載安裝到手機圖標消失了是什么原因呢?

下載好的應用竟然找不到了&#xff1f;究竟有哪些原因呢&#xff1f;本篇文章將總結一些可能性&#xff01; 若你在蘋果設備上下載了一個應用程序&#xff0c;但它的圖標不見了&#xff0c;可能有以下幾種原因&#xff1a; 1. 刪除應用的時候出現彈窗如果你錯誤的點擊到了從…

EasyRecovery2024破解版本下載,電腦數據恢復新突破!

在當今數字化時代&#xff0c;數據安全和軟件版權已成為全球關注的熱點。EasyRecovery&#xff0c;作為一款廣受歡迎的數據恢復軟件&#xff0c;因其強大的數據恢復功能而深受用戶喜愛。然而&#xff0c;隨著“EasyRecovery2024 crack”關鍵詞的流行&#xff0c;我們不得不面對…

電子電氣架構 —— 刷寫模式:并行刷寫

電子電氣架構 —— 刷寫模式:并行刷寫 我是穿拖鞋的漢子,魔都中堅持長期主義的工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 人們會在生活中不斷攻擊你。他們的主要武器是向你灌輸對自己的懷疑:你的價值、你的能力、你的潛力。他們往往會將此…

【深度學習入門篇一】阿里云服務器(不需要配環境直接上手跟學代碼)

前言 博主剛剛開始學深度學習&#xff0c;配環境配的心力交瘁&#xff0c;一塌糊涂&#xff0c;不想配環境的剛入門的同伴們可以直接選擇阿里云服務器 阿里云天池實驗室&#xff0c;在入門階段跑個小項目完全沒有問題&#xff0c;不要自己傻傻的在那配環境配了半天還不匹配&a…

二叉樹的層序遍歷Ⅱ-力扣

很簡單的一道題&#xff0c;將前一道題的結果數組進行一次反轉即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(i…

【ARM Cache 系列文章 2.1 -- Cache PoP 及 PoDP 介紹】

請閱讀【ARM Cache 及 MMU/MPU 系列文章專欄導讀】 及【嵌入式開發學習必備專欄】 文章目錄 PoP 及 PoDPCache PoDPCache PoP應用和影響PoP 及 PoDP Cache PoDP 點對深度持久性(Point of Deep Persistence, PoDP)是內存系統中的一個點,在該點達到的任何寫操作即使在系統供電…

石油行業的數字化轉型與智能化發展:新技術綜合運用助力業務提升

引言 石油行業面臨的挑戰與機遇 石油行業是全球能源供應的重要支柱&#xff0c;然而&#xff0c;隨著資源枯竭、環境壓力增加以及市場競爭加劇&#xff0c;石油企業面臨著前所未有的挑戰。傳統的勘探和生產方式已經難以滿足當前高效、安全、環保的要求。同時&#xff0c;能源轉…

用幻燈片來解釋C/C++指針及運算

在互聯網上發現了一個很好的C入門學習網站&#xff0c;用各種圖表和幻燈片來學習C知識&#xff0c;非常直觀&#xff0c;一目了然&#xff0c;比看文字更容易理解。做個搬運工用中文分享一下C/C最難懂的的內存指針的講解&#xff0c;由淺入深的將指針解釋的很清楚易懂&#xff…

web刷題記錄(3)

[NISACTF 2022]checkin 簡單的get傳參,好久沒做過這么簡單的題了 王德發&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff0c;看了源代碼以后&#xff0c;本來以為是js腳本的問題&#xff0c;但是禁用js腳本沒用&#xff0c;看了大佬的wp以后…

鴻蒙輕內核M核源碼分析系列六 任務及任務調度(2)任務模塊

任務是操作系統一個重要的概念&#xff0c;是競爭系統資源的最小運行單元。任務可以使用或等待CPU、使用內存空間等系統資源&#xff0c;并獨立于其它任務運行。鴻蒙輕內核的任務模塊可以給用戶提供多個任務&#xff0c;實現任務間的切換&#xff0c;幫助用戶管理業務程序流程。…

智慧校園究竟有何魅力?

隨著科技的快速發展&#xff0c;智慧校園已成為教育領域的熱門話題。智慧校園利用先進的技術手段&#xff0c;將信息化與教育深度融合&#xff0c;為學生、教師和家長提供更便捷、高效的教育服務。本文將帶您深入了解智慧校園的魅力&#xff0c;讓您對未來教育的發展充滿期待。…

Ego微商項目部署(小程序項目)(全網最詳細教程)

目錄 1.項目部署前的準備 1.1獲取APPID和APPSecret&#xff08;微信小程序&#xff09; 1.2測試工具 1.3微信開發者工具下載與安裝 2.Ego微商后端項目部署 2.1部署細節流程 2.2部署架構圖 2.3組件要求及版本 2.4后臺部署操作 2.4.1安裝vm和cenos7 2.4.2本地服務檢查…

我們如何利用 0 美元營銷將 UX/UI 產品發展到 320k 用戶

嘿 &#x1f44b; 我是 Paul&#xff0c;FlowMapp 的聯合創始人。 現在&#xff0c;我們是一個由7人&#xff08;少數兼職成員&#xff09;組成的團隊&#xff0c;試圖將產品擴展到$ 1M ARR。 希望這些對您有所幫助&#xff0c;并祝您未來的產品好運&#xff01; 我決定與…

【AI大模型】Transformers大模型庫(四):AutoTokenizer

目錄??????? 一、引言 二、自動分詞器&#xff08;AutoTokenizer&#xff09; 2.1 概述 2.2 主要特點 2.3 代碼示例 三、總結 一、引言 這里的Transformers指的是huggingface開發的大模型庫&#xff0c;為huggingface上數以萬計的預訓練大模型提供預測、訓練等服…

PMAT安裝及使用(Bioinformatics工具-021)

01 背景 PMAT 是一個高效的組裝工具包&#xff0c;用于利用第三代&#xff08;HiFi/CLR/ONT&#xff09;測序數據組裝植物線粒體基因組。PMAT 還可以用于組裝葉綠體基因組或動物線粒體基因組。 PMAT&#xff1a;使用低覆蓋度HiFi測序數據的高效植物線粒體組裝工具包-文獻精讀…