组件通信-mitt

mitt:与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信

第一步:安装mitt

npm i mitt

第二步:新建文件:src\utils\emitter.ts
// 引入mitt
import mitt from "mitt"; 

//调用mitt得到emitter,emitter能:绑定事件、触发事件、解绑事件
const emitter= mitt()

//暴露/导出
export default emitter;
第三步:接收数据的组件中:绑定事件、同时在销毁前解绑事件:
<script setup lang="ts">
import { ref,onUnmounted } from 'vue'
import emitter from '@/utils/emitter';
const toy = ref('奥特曼')
const phone = ref('')

// 绑定send-phone事件监听  
emitter.on('send-phone', (value: any) => {  
  phone.value = value // 当接收到'send-phone'事件时,将传递的值赋值给phone  
  console.log(value); // 输出接收到的值  
})  

// 在组件卸载时解除事件监听  
onUnmounted(() => {  
  emitter.off('send-phone') // 移除名为'send-phone'的事件监听  
})  
</script>

<template>
  <div class="child">
    <h1>子组件2</h1>
    <h3>子组件2的玩具:{{ toy }}</h3>
    <h3>组件1给的手机:{{ phone }}</h3>
  </div>

</template>
 第四步:提供数据的组件,在合适的时候触发事件
<script setup lang="ts">
import { ref } from 'vue'
import emitter from '@/utils/emitter';
const phone = ref('oppo')
</script>

<template>
  <div class="child">
    <h1>子组件1</h1>
    <h4>子组件1的手机:{{ phone }}</h4>
    <!-- 点击按钮时,通过事件总线发送名为'send-phone'的事件,并传递phone变量作为参数 -->  
    <button @click="emitter.emit('send-phone', phone)">测试</button>
  </div>

</template>

### Vue3 祖孙组件通信的方法 在 Vue 3 中,祖孙组件之间的通信可以通过多种方式进行。其中较为常见的方式有提供/注入 (`provide` / `inject`) 和 使用事件总线(如 mitt)。这两种方式都能有效地解决跨层级组件间的通信需求。 #### 方法一:使用 provide/inject 进行祖孙组件通信 这种方式适用于祖父组件向其所有的子孙后代传递数据或函数的情况。祖先组件通过 `provide` 提供属性给它的所有子树中的任何后代组件访问;而这些后代则可通过 `inject` 接收并使用这些被提供的资源[^1]。 ```javascript // 爷爷组件 GrandParent.vue <template> <div> <h2>Grand Parent Component</h2> <p>{{ message }}</p> <Child /> </div> </template> <script setup> import Child from './Child.vue' import { ref, provide } from 'vue' const message = ref('Hello from grand parent') provide('sharedMessage', message) // 将message作为可注入项暴露出去 </script> ``` ```html <!-- 孙子组件 GrandChild.vue --> <template> <div> <h3>Grand Child Component</h3> <span>Inherited Message: {{ inheritedMessage }}</span> </div> </template> <script setup> import { inject } from 'vue' const inheritedMessage = inject('sharedMessage') // 注入来自祖先的消息 </script> ``` 这种方法简单易懂,并且不会破坏组件的封装性,因为只有明确声明要接收的数据才会被接收到。 #### 方法二:利用第三方库如 mitt 创建全局事件中心 对于更复杂的场景或者当不想让多个层次嵌套的组件之间形成紧密耦合时,则可以选择创建一个独立于应用之外的事件管理器来处理这种关系。这里推荐使用轻量级的 [mitt](https://github.com/developit/mitt),它可以很好地模拟原来 Vue 2.x 的 `$bus` 功能,在不引入额外依赖的情况下完成多层甚至平级组件间的交互[^4]。 ```bash npm install mitt --save ``` ```typescript // main.ts 或者单独建立 eventBus 文件夹下 index.ts 导出 bus 对象 import mitt from 'mitt'; export const emitter = mitt(); ``` ```javascript // 爷爷组件 GrandParent.vue 发送事件 <template> <div> <button @click="sendMessage">Send Message to Grandchild</button> </div> </template> <script setup> import { onMounted } from 'vue' import { emitter } from '@/eventBus' function sendMessage() { emitter.emit('grandparent-event', { data: 'This is a message from the grandparent component.' }) } </script> ``` ```javascript // 孙子组件 GrandChild.vue 监听事件 <template> <div> <p v-if="receivedData">{{ receivedData }}</p> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue' import { emitter } from '@/eventBus' let receivedData = ref(null) emitter.on('grandparent-event', ({data}) => { receivedData.value = data; }) onUnmounted(() => { emitter.off('grandparent-event'); }) </script> ``` 上述两种方法都可以有效实现祖孙组件间的通信,具体选择取决于项目的实际需求和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃哈哈哈哈呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值