在vue1.0中,组件之间的通信主要通过vm.dispatch沿着父链向上传播和用vm.dispatch沿着父链向上传播和用vm.broadcast向下广播来实现。然而在vue2.0中,已经废除了这种用法。
vuex加入后,对组件之间的通信有了更加清晰的 *** 作,对于中大型的项目来说,一开始就把vuex的使用计划在内是明智的选择。
然而在一些小型的项目,或者说像我这样写到一半才发现vue2.0用不了.broadcast和.broadcast和dispatch的人来说,就需要一个比较便捷的解决方法。那么,eventBus的作用就体现出来了。
主要是现实途径是在要相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发和监听来实现通信和参数传递。
这里来看一个简单的例子:
比如,我们这里有三个组件,main.vue、click.vue、show.vue。click和show是父组件main下的兄弟组件,而且click是通过v-for在父组件中遍历在了多个列表项中。这里要实现,click组件中触发点击事件后,由show组件将点击的是哪个dom元素console出来。
首先,我们给click组件添加点击事件
想要在doClick()方法中,实现对show组件的通信,我们需要新建一个js文件,来创建出我们的eventBus,我们把它命名为bus.js
importVuefrom'vue'exportdefaultnewVue()
这样我们就创建了一个新的vue实例。接下来我们在click组件和show组件中import它。
importBusfrom'common/js/bus.js'
接下来,我们在doClick方法中,来触发一个事件:
methods: { addCart(event){Bus.$emit('getTarget',event.target) } }
这里我们在click组件中每次点击,都会在bus中触发这个名为'getTarget'的事件,并将点击事件的event.target顺着事件传递出去。
接着,我们要在show组件中的created()钩子中调用bus监听这个事件,并接收参数:
created(){ Bus.$on('getTarget',target=>{console.log(target) }) }
这样,在每次click组件的点击事件中,就会把event.target传递到show中,并console出来。
所以eventBus的使用还是非常便捷的,但是如果是中大型项目,通信比较复杂,还是建议大家直接使用vuex。
来看一个实际例子:
我们创建了一个selection.vue的下拉框组件,在layout.vue组件中使用了selection.vue组件,我们要实现点击layout.vue组件页面的任意一处(除下拉框组件本身外),都可以将下拉框收起来。首先,新建了一个eventBus.js文件,在里面新建了一个vue的实例赋值给const eventBus,在selection.vue和layout.vue中分别import eventBus from '../../eventBus'和import eventBus from '../eventBus',则eventBus对于selection.vue和layout.vue就是一个全局的vue实例对象,然后通过分别调用eventBus这个实例的事件触发emit和事件监听emit和事件监听on来实现通信和参数传递。图6,是为了在一个页面中,把selection.vue使用了至少两次,则我们点击任意一个selection.vue的同时,要把其它的selection.vue给收起来,如图7。
图1:
图2:
图3:
图4:
图5:
图6:
图7:
class Data{public int what}@Subscriber(tag = "onEventMainThread")public void onEventMainThread(DPBusEvent event) {//处理接收到的数据}private void init(Context context) {EventBus.getDefault().register(this)//需要时注册//EventBus.getDefault().unregister(this)//不需要时反注册Data data = new Data() data.what = 0x8001 EventBus.getDefault().post(data, "onEventMainThread")}EventBus的配置:1、访问官网:
https://github.com/greenrobot/EventBus
EventBus线程说明:
POSTING:发布在哪个线程,那么订阅处理一定会在同一个线程进行处理
MAIN:订阅处理回调函数在主线程进行处理
MAIN_ORDERED:和上面的一样的功能,但是他们俩是有差别的
BACKGROUND:订阅处理回调函数在后台进行处理
ASYNC:我的订阅回调函数一定会在独立运行而且新开的线程
而EventBus的基本使用:
1、注册和解除:可以在订阅处理方中选择一对生命周期进行:
2、定于事件对象
3、在发布执行事件的发生,并通过EventsBus去告诉订阅方
4、在订阅方进行回调的处理
然后说下EventsBus是如何控制线程的,在注释后面添加线程的模式
回到开始所说的MAIN和MAIN_ORDERED的区别,他们共同性:使订阅方总在主线程进行处理,但他们的区别在哪里呢?
MAIN的执行顺序是发布方发送-->订阅方处理-->订阅方处理完成-->发布方执行完成
而MAIN_ORDERED的执行顺序是发布方发送-->发布方执行完成-->订阅方处理-->订阅方处理完成
注意他们的顺序,会发现,MAIN会阻塞线程,一定要等到订阅方处理完成之后,发布方才可以执行完成,而MAIN_ORDERED就比较通人性了,我发完就进行发下一个,就不等你了。
然后说下post和postSticky的区别
post会使组件的通讯按照事件-->订阅-->发布进行,
而postSticky是事件-->发布-->订阅进行,同时postSticky的订阅回调注释需要增加为sticky = true
然后,有点需要大家注意的,就是通过EventsBus订阅回调的方法都是显示为未调用的状态
如果你的项目在build.gradle中设置如下:
然后在proguard-rules的文件进行粘贴就可以了!!
好了,到此结束,最近会继续研究kotlin大法,后面所说到的框架,我会尽量用kotlin进行展示,感谢各位客官的观看!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)