vue任意关系组件通信与跨组件监听状态vue-communication
众所周知,组件式开发方式给我们带来了方便,不过也引入了新的问题,组件之间的数据就像被一道无形的墙隔开,如果我们希望临时让两个组件直接通信,vuex太巨,而$emit又不好维护provider不可控这个时候就该今天的主角vue-communication登场了!
vue-communication介绍
- 他是一个可观测可调试的vue组件通信方案
- 任意关系组件可直接通信
- 支持跨组件监听数据变化
- 支持发送离线数据
安装
yarnaddvue-communication //或者npminstallvue-communication-D
引入
import{$sender,$receiver}"vue-communication"; Vue.prototype.$sender=$sender; Vue.prototype.$receiver=$receiver;
视频教程
用法
基本概念:
该组件暴露两个主要API一个是发送者$sender一个是接受者$receiver,所有的通信都通过这两个方法来实现,这里希望大家将$sender理解成发送意图的发送者,他发送的是意图,意图就是希望做一件什么事情。
意图类型:dataOncemodifyOncedatamodifywatch
目前只有以上5种意图分别涵盖了:发送数据的一次和多次,修改数据的一次和多次,跨组件监听数据变化
发送数据:
假如A组件只向B组件发送一次数据:
A组件中直接使用this.$sender("dataOnce-A-B",{d:"我是数据"})
B组件中在任意时刻(哪怕B都还没挂载都行,放心食用)使用this.$receiver("dataOnce-A-B")这个函数返回一个Promise对象,直接.then接收即可
发送多次就用this.$sender("data-A-B","我是数据"),该方法调用多次,对应组件就会多次接收该数据
接收会有变化,由于会多次接收所以无法使用Promise来实现,请在参数追加回调this.$receiver("data-A-B",function(data){//data就是数据})
注意:
这里面的意图修饰符-组件1-组件2的格式是强制的,不管你的组件名有多长,你都要完整的给出!下面的修改数据也一样,对应到data-A-B这个案例,其整个字符串可以称为一个“意图”,data叫做意图修饰符。
接收回执:
我相信大家都明白一个道理,如果委托A给B送东西,在A送到之后不应该默不吭声的就完了,而是应该告诉你一声,嘿!你让我送的东西我已经送到了哦!这就是回执。
需要注意的是回执目前只有在一次性操作中才会有,例如dataOncemodifyOnce
他们通过$sender返回的Promise对象给出,让发送者可以知道,我发送的数据什么时候被接收了
this.$sender("dataOnce-A-B","木瓜太香") .then(flag=>{ console.log("接受者已经接受到数据了!") })
修改数据:
A组件中使用this.$sender("modifyOnce-A-B","name","木瓜太香")表示A组件要修改B组件中的name属性把他变为木瓜太香
B组件中使用this.$receiver("modifyOnce-A-B","name")即可完成修改,注意第二个参数必须传,这是一个许可,表示你认可A组件修改当前组件的name属性,如果你写错了或者没传那么许可不成立,这是一个让数据变动可预测也强迫开发者需要更清楚自己在做什么的一个实现。
如果你要改obj对象下的name那么可以写成this.$sender("modifyOnce-A-B","obj.name","木瓜太香")
如果你要修改多次可以参照data意图的示例,使用modify意图修饰符即可,注意,目前修改是没有回调的,如果你想知道数据什么时候被修改,可以自己在组件内部监听。
跨组件监听数据:
假如A组件要监听B组件中的name数据变动:
A组件使用this.$sender("watch-A-B","person.name",function(nv,ov){//nv表示新值ov表示旧值})
B组件只需要给出一次许可即可:this.$receiver("watch-A-B","person.name")
到此这篇关于vue任意关系组件通信与跨组件监听状态vue-communication的文章就介绍到这了,更多相关vue任意关系组件通信与跨组件监听状态内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!