兄弟组件间的传值 - $bus

本文介绍了如何在Vue应用中利用$bus(事件总线)进行兄弟组件之间的通信,通过创建一个Vue实例并注册到原型,简化了组件间的数据传递,展示了发布/订阅模式的实际操作和示例代码。

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

兄弟组件间的传值 - $bus

兄弟组件之间的传值方式有很多,例如很方便的 vuex,或者通过传父组件再传兄弟组件,这里介绍 vue 中的 $bus 的使用方法

首先在 main.js 中创建一个新 vue 实列

import Vue from 'vue'
import App from './App'
import router from './router'

import Vant from 'vant';
import 'vant/lib/index.css';

Vue.prototype.$bus = new Vue({

})  //创建一个 vue 实例,将 $bus 注册到 vue 的 prototype 上

new Vue({
  router,
  Vant,
  render: h => h(App)
}).$mount('#app')

创建 brother.vue 文件作为要传入的兄弟组件

<template>
    <div>
        我是兄弟组件
    </div>
</template>
<script>
export default {
    created(){
        this.$bus.$on('fun',this.brotherL)  //监听事件 fun,定义自己的方法 brotherL 来获取传递过来的值
    },
    methods: {
        brotherL(e){
            console.log(e)  //打印兄弟组件传过来的值
        }
    }
}
</script>

再创建 child.vue 作为子组件,它的兄弟组件就是 brother

<template>
    <div>
        我是孩子组件
        <button @click="sayLove()">向兄弟表白</button>  //绑定传值方法,点击按钮触发 sayLove方法
    </div>
</template>
<script>
export default {
    data(){
    },
    methods:{
        sayLove(){
            this.$bus.$emit('fun','i love u')  //向兄弟组件发布事件 fun,传递参数为 i love u
        }
    }
}
</script>

在父组件中注册 child 和 brother 组件

<template>
<div id="app">
  <Child></Child>
  <Brother></Brother>
    <router-view/>
</div>
</template>
<script>
import Child from './components/child.vue'
import Brother from './components/brother.vue'
export default {
  name: 'App',
  components:{
    Child,
    Brother
  }
}
</script>

点击按钮,打印 i love u
在这里插入图片描述
在 vue.prototype 中注册 $bus 事件用于兄弟组件传值,本质上是一个发布订阅的模式:

emit — 发布消息,通知订阅中心有数据更新,也就是发射事件
on — 添加订阅者,也就是监听事件

### Vue.js兄弟组件的通信方法 在 Vue.js 开发过程中,兄弟组件的通信是一个常见的需求。以下是几种实现兄弟组件的主要方式: #### 1. 使用 `$emit` 和 `$on` 的事件总线模式 通过创建一个独立的 `EventBus` 实例作为桥梁,在两个兄弟组件递消息。具体操作如下: - 创建一个单独的文件用于导出一个新的 Vue 实例作为事件中心。 - 在发送方组件中使用 `$emit` 发送事件并附带数据。 - 在接收方组件中使用 `$on` 订阅该事件。 例如,按照引用描述[^3],可以通过以下代码片段完成此功能: ```javascript // 文件 bus.js import Vue from 'vue'; export default new Vue(); // 兄弟 A 组件发出事件 import bus from './bus'; methods: { sendToBrother() { const message = "Hello Brother!"; bus.$emit('messageFromA', message); } } // 兄弟 B 组件监听事件 import bus from './bus'; created() { bus.$on('messageFromA', (msg) => { console.log(msg); // 输出 Hello Brother! }); } ``` #### 2. 利用父级组件中介 另一种常见的方式是借助共同的父组件来进行中协调。子组件向父组件发射事件(`$emit`),再由父组件将接收到的数据转发给另一个子组件。这种方式更符合单向数据流原则,并且易于维护和调试。 如引用所提到的内容[^1][^2],可以在实际开发场景下这样实践: ```html <!-- ParentComponent.vue --> <template> <div> <ChildOne @defineBrother="handleDefineBrother"></ChildOne> <ChildTwo :brotherData="receivedData"></ChildTwo> </div> </template> <script> import ChildOne from './ChildOne.vue'; import ChildTwo from './ChildTwo.vue'; export default { components: { ChildOne, ChildTwo }, data() { return { receivedData: null, }; }, methods: { handleDefineBrother(data) { this.receivedData = data; }, }, }; </script> ``` #### 3. Vuex 状态管理工具 对于复杂应用或者需要跨多层嵌套组件共享状态的情况,推荐采用 Vuex 进行集中化状态管理。Vuex 提供了 store 来存储全局可访问的状态以及相应的 mutation 和 action 对其进行修改。任何地方都可以读取这些公共变量并通过提交 mutations 或 dispatch actions 更新它们。 虽然引用未提及 Vuext[^4]^ ,但它确实是解决大规模项目中组件通讯的有效手段之一。 --- ### 总结 以上介绍了三种主要的 vue 兄弟组件技术:基于 event-bus 的直接交互、依赖于父子链路接沟通还有利用 vuex 做统一控制。每种方案都有各自的适用范围与优缺点,请依据项目的具体情况选取最合适的策略。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值