Vue-发布订阅机制(bus)实现非父子组件的传值

Vue.js组件间通信
本文介绍了一种在Vue.js中实现组件间通信的方法,通过在Vue.prototype上挂载一个bus属性,指向一个Vue实例,使得所有组件都能通过这个bus进行消息的发送和接收,实现了组件间的解耦和数据的动态更新。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <child :content="'全部变成第1项内容'"></child>
    <child :content="'全部变成第2项内容'"></child>
  </div>
</body>
<script type="text/javascript" src="./vue.js"></script>
<script
<!-- 把Vue.prototype上挂载一个bus属性,这个属性指向1个vue实例,
以后创建组件的时候,每个组件上都会有bus这个属性,都指向同一个实例 -->
Vue.prototype.bus=new Vue();
Vue.component('child',{
  props:['content'],
  template:"<div @click='handleClick'>{{selfContent}}</div>",
  data:function(){
    return {
      selfContent:this.content
    }
  },
  methods:{
    handleClick:function(){
      //本组件向外触发change,并携带值
      this.bus.$emit('change',this.content);
    }
  },
  mounted:function(){
    var this_=this
    //其它组件监听change,并取得值
    //两个child的组件都对change进行了监听
    this.bus.$on('change',function(msg){
      console.log('change');
      this_.selfContent=msg;
    })
  }
})
var app=new Vue({
    el:'#app',
})
</script>
</html>

 

### 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**:适合复杂的全局状态管理,尤其在多组件共享状态时推荐使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值