vue中非父子组件通信

本文介绍了Vue中非父子组件的通信方式,包括使用Provide和Inject进行深度嵌套组件间的数据共享,以及利用mitt库实现全局事件总线。详细阐述了Provide/Inject的两种写法及其注意事项,同时也讨论了mitt库在vue3中作为事件总线的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇博客中,我们总结了父子组件通信方式有:props + emit。这里我们将总结一下,非父子组件通信方式,这里还不涉及到Vuex。
如果存在祖孙组件,我们可以通过ProvideInject进行通信。
如果不是祖孙组件,也不是父子组件,我们可以采用Mitt全局事件总线第三方库来实现。
一、Provide和Inject
ProvideInject用于非父子组件之间共享数据,比如有一些深度嵌套的组件,子组件想要获取父组件的数据,如果不存在Provide和Inject选项,我们可以通过props进行一次传递数据,但是这样做太过于繁琐。
对于上述情况,我们可以使用ProvideInject
无论组件结构嵌套有多深,父组件都可以作为子组件数据的提供者。
父组件存在Provide来提供数据。
子组件存在Inject来获取数据。
在实际过程中,父组件不知道哪个子组件使用其数据,子组件也不知道使用的是哪个父组件的数据。
Provide和Inject的基本使用

//父组件
<template>
  <div>
    <Content></Content>
  </div>
</template>

<script>
import Content from "./components/Content.vue";
export default {
   
  data() {
   
    return {
   };
  },
  provide:{
   
    name:"张三",
    age:20
  },
  components: {
   
    Content
  }
};
</script>

<style scoped></style>
//子组件
<template>
  <div>
    <h1>这里是Content组件</h1>
    <h1>{
   {
    name }} -- {
   {
   age}}</h1>
    <ContentBase></ContentBase>
  </div>
</template>

<script>
import ContentBase from "./ContentBase.vue";
export default {
   
  data() {
   
    return {
   };
  },
  components: {
   
    ContentBase
  },
  inject:["name", "age"]
};
### Vue中非父子组件通信方法 在Vue中,非父子组件之间的通信可以通过多种方式实现,包括事件总线、`provide/inject`以及Vuex等。以下是这些方法的具体实现和使用场景: #### 1. 事件总线(Event Bus) 事件总线是一种基于发布-订阅模式的通信机制,适用于简单的跨组件通信。可以使用一个空的Vue实例作为事件中心[^3]。 ```javascript // utils/event-bus.js import mitt from 'mitt'; const eventBus = mitt(); export default eventBus; ``` 在需要发送事件的组件中触发事件: ```javascript // ComponentA.vue import eventBus from './utils/event-bus'; export default { methods: { sendEvent() { eventBus.emit('customEvent', { message: 'Hello from ComponentA' }); } } }; ``` 在需要接收事件的组件中监听事件: ```javascript // ComponentB.vue import eventBus from './utils/event-bus'; export default { created() { eventBus.on('customEvent', (data) => { console.log('Received data:', data); }); }, unmounted() { eventBus.off('customEvent'); // 清理事件监听器 } }; ``` #### 2. `provide/inject` `provide/inject` 是Vue提供的一种用于祖代与后代组件之间通信的机制。它可以传递数据或方法,且支持响应式[^2]。 在祖先组件中通过 `provide` 提供数据: ```javascript // ParentComponent.vue export default { provide() { return { sharedData: this.data, updateData: this.updateData }; }, data() { return { data: 'Initial Data' }; }, methods: { updateData(newData) { this.data = newData; } } }; ``` 在后代组件中通过 `inject` 接收数据: ```javascript // ChildComponent.vue export default { inject: ['sharedData', 'updateData'], mounted() { console.log('Injected data:', this.sharedData); this.updateData('Updated Data'); } }; ``` #### 3. Vuex Vuex 是Vue的状态管理库,适用于复杂的应用场景,尤其是当多个组件需要共享状态时[^4]。通过Vuex,可以在全局范围内管理应用的状态。 首先,定义一个Vuex store: ```javascript // store/index.js import { createStore } from 'vuex'; export default createStore({ state: { sharedState: 'Initial State' }, mutations: { updateSharedState(state, newState) { state.sharedState = newState; } }, actions: { updateSharedState({ commit }, newState) { commit('updateSharedState', newState); } } }); ``` 在组件中使用Vuex: ```javascript // ComponentA.vue export default { methods: { updateState() { this.$store.dispatch('updateSharedState', 'Updated State from ComponentA'); } } }; // ComponentB.vue export default { computed: { sharedState() { return this.$store.state.sharedState; } }, mounted() { console.log('Shared state:', this.sharedState); } }; ``` ### 总结 - **事件总线**:适用于简单的跨组件通信,但随着项目规模增大可能变得难以维护。 - **`provide/inject`**:适合祖代与后代组件之间的通信,能够传递响应式数据。 - **Vuex**:适合复杂的全局状态管理,尤其在多组件共享状态时推荐使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值