PubSub发布订阅模式与Vue组件通信

     面对兄弟组件通信,需要让某组件通过props的方法将信息传递给父组件,再由父组件传递给目标兄弟组件。这样的通信十分繁琐,在不使用redux技术的前提下可以尝试使用消息的订阅-发布机制来实现通信。有很多的工具实现了该方法,这里介绍PubSub工具发布(publish)订阅(subscribe)消息实现兄弟组件之间的通信。

下载: npm i pubsub-js -s     /      yarn add pubsub-js

使用:1) import PubSub from 'pubsub-js' // 引入

           2) PubSub.subscribe('delete', function (data) {  }); // 订阅

           3) PubSub.publish('delete',data); // 根据订阅的消息进行消息发布

     贴出github上的使用方法,在需要接收数据的组件里订阅消息,然后设置好订阅消息的名称。

// create a function to receive the topic
// 第一个参数msg是消息名称 第二个参数data是别人想传递过来的数据
var mySubscriber = function (msg, data) {
    console.log(msg, data);
};

// subscribe实现消息的订阅 第一个参数是消息的名称 第二个参数的函数在收到消息后进行调用
// 这里的token类似setInterval的timer作为标识 当不再订阅消息时通过这个token取消订阅
var token = PubSub.subscribe('MY TOPIC', mySubscriber);

// unsubscribe this subscriber from this topic
// 根据token标识取消订阅
PubSub.unsubscribe(token);

示例

/**
*  在componentDidMount的生命周期中常用来做一些初始化的事,如进行开启定时器、发布消息等方法
*  在需要接收信息的组件中订阅消息
*/
componentDidMount () {
    this.token = Pubsub.subscribe('answer', (msg, data)=>{
        console.log(data)
    })
}

/**
*  取消消息订阅
*/
componentWillUnmount () {
    Pubsub.unsubscribe(this.token)
}


/**
*  发布消息的组件,在某个具体调用的方法中进行消息发布
*/
search = ()=>{
    Pubsub.publish('answer', {name: 'imlzz', age: 20})
}

前面介绍的是在React中使用PubSub这个工具来实现兄弟间的发布订阅模式,接下来复习一下如何在Vue中利用该模式的思想实现父子组件之间的通信。

这里介绍两种方法。

首先看看第一种,这一种方法参考了React是如何父子通信的,父组件创建一个函数作为发布事件,该函数可以带上参数。接下来在子组件中调用该函数,在调用的过程中可以将子组件中的数据作为参数进行调用。这样的方式就是所谓的:父组件只负责实现各种逻辑代码,不考虑具体数据。

代码分析:

 

 父组件将一个函数作为prop传递给子组件,然后子组件通过prop接收,并且在具体函数中通过this.getSchoolName(childData)执行该函数,最后在父组件中打印: App收到了学校名:子组件中的数据。

再来看第二种方法,传统的this.$emit方法,在父组件中通过v-on自定义一个函数,然后子组件在某时刻通过this.$emit('xxx',params)调用该函数即可。

 

需要补充的是,$emit方法其实有一个对应的方法$on,利用ref获取到元素之后,可以直接通过$on方法表示发布了一个任务。这样写的好处是更灵活了,假设我们现在需要让父元素在5秒后将任务发布给子元素,那么可以在这里的mounted中添加一个定时器。

这一系列配套的还有.$off方法取消注册自定义事件,多个事件保存在一个数组中。

this.$off(['xxxxevent', 'xxEvent'])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值