最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3 組件間通信之mitt實(shí)現(xiàn)任意組件間通信的步驟

 更新時(shí)間:2024年05月20日 11:51:08   作者:bigcarp  
mitt 主要有4個(gè)API:emit(觸發(fā)某個(gè)事件)、on(綁定事件)、off(解綁某個(gè)事件)、all(獲取所有綁定的事件),這篇文章主要介紹了Vue3 組件間通信之mitt實(shí)現(xiàn)任意組件間通信,需要的朋友可以參考下
pnpm install mitt

mitt 主要有4個(gè)API:emit(觸發(fā)某個(gè)事件)、on(綁定事件)、off(解綁某個(gè)事件)、all(獲取所有綁定的事件)

使用步驟:

(1)main.js中將mitt全局注冊(cè)

(2)在A組件中emit 發(fā)射事件(發(fā)射信號(hào))

(3)在B組件中監(jiān)聽事件

(4)移除監(jiān)聽

main.js 中通過(guò) app.config.globalProperties 將 mitt 實(shí)例注冊(cè)為全局屬性。整個(gè)應(yīng)用中的任何組件都可以方便地訪問(wèn)和使用事件總線,無(wú)需單獨(dú)引入。

//main.js
import { createApp } from 'vue';
import App from './App.vue';
import mitt from 'mitt';
const app = createApp(App);
// 將 mitt 實(shí)例掛載到全局屬性
app.config.globalProperties.$bus = mitt();
app.mount('#app');

App.vue 簡(jiǎn)版寫法

<template>
  <div>
    <div v-if="showTaskLog">Task Log is shown</div>
    <ChildComponent />
  </div>
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue';
const showTaskLog = ref(false);            //顯示/隱藏日志
const { proxy } = getCurrentInstance();    //setup 中可以通過(guò) proxy 獲取全局屬性
proxy.$bus.on('show-task-log', data => { showTaskLog.value = true;});    //監(jiān)聽'show-task-log' 事件, 發(fā)生show-task-log事件就執(zhí)行()=>{ showTaskLog.value = true;}
</script>
<!--
此方案沒(méi)有使用 onUnmounted 來(lái)管理事件監(jiān)聽器的生命周期,潛在的內(nèi)存泄漏問(wèn)題。注冊(cè)到全局變量,不會(huì)因?yàn)榻M件銷毀而銷毀,內(nèi)存沒(méi)有得到釋放。
如果在組件卸載時(shí)你不需要移除事件監(jiān)聽器,或者你確定事件監(jiān)聽器的生命周期與組件的生命周期一致,這種簡(jiǎn)化方式是可以的。
-->

推薦使用 onMountedonUnmounted ,這樣可以確保組件卸載時(shí)不會(huì)出現(xiàn)內(nèi)存泄漏。

App.vue 推薦寫法

<!--App.vue-->
<template>
  <div>
    <div v-if="showTaskLog">Task Log is shown</div>
    <ChildComponent />
  </div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, getCurrentInstance } from 'vue';
const showTaskLog = ref(false);
const { proxy } = getCurrentInstance();
onMounted(() => { proxy.$bus.on('show-task-log', ()=> {showTaskLog.value = true;});});
onUnmounted(() => { proxy.$bus.off('show-task-log');}); // 不指定移除哪個(gè)回調(diào)函數(shù),就移除監(jiān)聽show-task-log的綁定的所有回調(diào)函數(shù)。
</script>

如果多個(gè)回調(diào)函數(shù)監(jiān)聽同一個(gè)事件,而onUmounted時(shí)只想移除特定的回調(diào)函數(shù)則需要這樣寫:

const handleShowTaskLog = () => {
  console.log('handleShowTaskLog called');
};
const anotherHandler = () => {
  console.log('anotherHandler called');
};
onMounted(() => {
  proxy.$bus.on('show-task-log', handleShowTaskLog);
  proxy.$bus.on('show-task-log', anotherHandler);
});
onUnmounted(() => {
  proxy.$bus.off('show-task-log', handleShowTaskLog);
  // 這樣可以確保 only handleShowTaskLog 被移除,而 anotherHandler 仍然會(huì)被觸發(fā)
});

發(fā)射

<template>
  <button @click="triggerAsyncFunction">Show Task Log</button>
</template>
<script setup>
import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const triggerAsyncFunction = async () => {
  // 發(fā)射事件通知其他組件
  proxy.$bus.emit('show-task-log');
  // 模擬一個(gè)異步函數(shù)
  await new Promise(resolve => setTimeout(resolve, 1000));
};
</script>

到此這篇關(guān)于Vue3 組件間通信之mitt實(shí)現(xiàn)任意組件間通信的文章就介紹到這了,更多相關(guān)Vue3 mitt任意組件通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于vue中 $emit的用法詳解

    關(guān)于vue中 $emit的用法詳解

    這篇文章主要介紹了vue中 $emit的用法,通過(guò)實(shí)例代碼給大家介紹了子組件和父組件的相關(guān)知識(shí),需要的朋友參考下吧
    2018-04-04
  • Vue項(xiàng)目中引入Axios實(shí)現(xiàn)方式

    Vue項(xiàng)目中引入Axios實(shí)現(xiàn)方式

    本文詳細(xì)介紹了在Vue項(xiàng)目中引入和配置Axios插件的方法,包括全局配置、域名設(shè)置和錯(cuò)誤攔截等步驟,幫助開發(fā)者更高效地地使用Axios進(jìn)行HTTP請(qǐng)求
    2026-05-05
  • Vue實(shí)現(xiàn)右鍵菜單組件的超詳細(xì)教程(支持快捷鍵)

    Vue實(shí)現(xiàn)右鍵菜單組件的超詳細(xì)教程(支持快捷鍵)

    右鍵菜單組件非常常見,所有的前端開發(fā)工程師都會(huì)遇到類似的功能組件開發(fā)需求,這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)右鍵菜單組件的超詳細(xì)教程,文中介紹的方法支持快捷鍵,需要的朋友可以參考下
    2024-02-02
  • 如何使用VuePress搭建一個(gè)類型element ui文檔

    如何使用VuePress搭建一個(gè)類型element ui文檔

    這篇文章主要介紹了如何使用VuePress搭建一個(gè)類型element ui文檔,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例

    關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例

    本篇文章主要介紹了關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • vuex?mutations的兩種調(diào)用方法小結(jié)

    vuex?mutations的兩種調(diào)用方法小結(jié)

    這篇文章主要介紹了vuex?mutations的兩種調(diào)用方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Vue.js組件通信的幾種姿勢(shì)

    Vue.js組件通信的幾種姿勢(shì)

    組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。下面通過(guò)本文給大家分享Vue.js組件通信的幾種姿勢(shì),感興趣的朋友一起看看吧
    2017-10-10
  • 在Vue中使用highCharts繪制3d餅圖的方法

    在Vue中使用highCharts繪制3d餅圖的方法

    本篇文章主要介紹了在Vue中使用highCharts繪制3d餅圖的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 使用 Vue 3 的 createApp方法初始化應(yīng)用的基本步驟

    使用 Vue 3 的 createApp方法初始化應(yīng)用的基本步驟

    createApp 是 Vue 3 引入的全局 API,用于創(chuàng)建一個(gè)應(yīng)用實(shí)例,這篇文章主要介紹了如何使用 Vue 3 的 createApp方法初始化應(yīng)用,通過(guò) createApp 方法,我們從 Vue 3 的基本初始化開始,擴(kuò)展到插件的應(yīng)用、多個(gè)應(yīng)用實(shí)例的創(chuàng)建等,需要的朋友可以參考下
    2024-05-05
  • 使用vue-router為每個(gè)路由配置各自的title

    使用vue-router為每個(gè)路由配置各自的title

    這篇文章主要介紹了如何使用vue-router為每個(gè)路由配置各自的title,及使用vue router的方法,需要的朋友可以參考下
    2018-07-07

最新評(píng)論

墨江| 泽州县| 南通市| 陆良县| 南郑县| 新巴尔虎右旗| 广水市| 昆山市| 富民县| 泰安市| 垣曲县| 常山县| 牟定县| 托克托县| 丰台区| 汕尾市| 五寨县| 尉犁县| 临汾市| 和静县| 静安区| 夹江县| 双鸭山市| 漳平市| 福海县| 鹤庆县| 诏安县| 交口县| 松原市| 岳阳县| 舞阳县| 巫溪县| 肇东市| 宜昌市| 东丽区| 郁南县| 扎赉特旗| 磐安县| 邹平县| 新源县| 礼泉县|