Vue.js之组件间的通信

目录

一、事件中心

二、$bus

三、第三方包pubsub-js


一、事件中心

前面已经介绍了父子组件中如何进行数据的传递,本文将介绍兄弟组件间数据的传递,核心是利用事件中心进行自定义事件的声明和监听(另外还有删除)

 1.定义事件中心

 2.在组件Tom中声明自定义事件,同时传递数据

3.在组件Jerry中的mounted函数中监听该事件,获取到num的值,进而完成相关操作

另外,可以销毁自定义事件,也是通过事件中心来销毁

案例效果:

代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 例子:组件Tom和组件Jerry相互传递自身的num数据 -->
    <style>
        .Tom {
            border: 2px solid red;
            width: 100px;
            margin-bottom: 50px;
        }
        
        .Jerry {
            border: 2px solid red;
            width: 100px;
            margin-bottom: 20px;
        }
    </style>
</head>

<body>
    <div id="app">
        <Tom class="Tom"></Tom>
        <Jerry class="Jerry"></Jerry>
        <div>
            <button @click='deleteE' v-text="'销毁事件'"></button>
        </div>
    </div>
    <script src="./vue.min.js"></script>
    <script>
        // 1.定义事件中心
        let hub = new Vue();
        Vue.component('Tom', {
            data: function() {
                return {
                    count: 0,
                    num: 100
                }
            },
            // 2.在组件Tom中声明自定义事件,同时传递数据
            template: `<div><div v-text="'Tom:'+count"></div><button @click="hub.$emit('JerryE',num)">点击</button></div>`,
            mounted() {
                hub.$on('TomE', (val) => {
                    this.count += val;
                })
            }

        });
        Vue.component('Jerry', {
            data: function() {
                return {
                    count: 0,
                    num: 1000
                }
            },
            template: `<div ><div v-text="'Jerry:'+count"></div><button @click="hub.$emit('TomE',num)">点击</button></div>`,
            // 3.在组件Jerry中的mounted函数中监听该事件,获取到num的值,进而完成相关操作
            mounted() {
                hub.$on('JerryE', (val) => {
                    this.count += val;
                })
            }
        })
        let vu = new Vue({
            el: '#app',
            data: {},
            methods: {
                deleteE() {
                    // 另外,可以销毁自定义事件,也是通过事件中心来销毁
                    hub.$off('TomE');
                    hub.$off('JerryE');
                }
            }
        })
    </script>
</body>

</html>

二、$bus

核心使用:首先在main.js中通过生命周期函数配置$bus.

组件在相互通信时,首先明确哪个向哪个传数据。要发送数据的一方需绑定事件,通过emit发送指定的数据。接受数据的一方需要在mounted函数中监听该自定义事件,从而获取传送过来的值。off是解除emit声明的自定义事件。

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './plugins/element.js'


Vue.config.productionTip = false

new Vue({
    router,
    store,
    render: h => h(App),
    beforeCreate() {
        Vue.prototype.$bus = this
    }
}).$mount('#app')

 

<template>
  <div>
    <div>名称: {{cname}}</div>
    <div>ID: {{id}}</div>
    <div><button @click="getID">点击</button></div>
     <div><button @click="mydestroy">销毁</button></div>
  </div>
</template>

<script>
import pubsub from 'pubsub-js'
export default {
name:'ChildA',
data(){
  return {
    cname:'组件A',
    id:1
  }
},
methods:{
  getID(){
    this.$bus.$emit('getAID',this.id)
  },
  mydestroy(){
    this.$destroy();
  }
},
mounted(){
  this.$bus.$on('getBname',(n)=>{
    console.log('A组件获取B组件名称:',n);
  })
  this.publd = pubsub.subscribe('content',(n,msg)=>{
    console.log(n,msg);
  })
  
},
beforeDestroy(){
  // 取消订阅"content"
  // pubsub.unsubscribe(this.publd);
  // 取消bus事件(getAID)
  this.$bus.$off('getAID');
}
}
</script>

<style>

</style>

 

<template>
  <div>
    <div>名称: {{cname}}</div>
    <div>ID: {{id}}</div>
    <div><button @click="sendName">点击传name</button></div>
    <div><button @click='sendMsg'>发布内容</button></div>
  </div>
</template>

<script>
import pubsub from 'pubsub-js'
export default {
name:'ChildB',
data(){
  return {
    cname:'组件B',
    id:2,
    msg:'这是组件B中的内容'
  }
},
methods:{
  sendName(){
    this.$bus.$emit('getBname',this.cname)
  },
  sendMsg(){
    pubsub.publish('content',this.msg)
  }
},
mounted(){
  this.$bus.$on('getAID',(id)=>{
    console.log('B组件获取了A组件的id:',id);
  })
}

}
</script>

<style >

</style>

三、第三方包pubsub-js

安装该包,首先弄清数据的发送方和接受方。发送方发布数据(名称加内容),接收方接受数据(在mounted中写)。取消订阅用unsubscribe.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值