如果在你项目中需要多处用到同级组件通讯,而又不想去写繁琐的vuex,可以参考这个小思路。本人在写项目中琢磨出来的,感觉挺好用,分享一下。

1.在utils文件夹下添加BusEvent.js

注释已经很详细了,也很简单,不再过多阐述。


  1. import Vue from "vue";
  2. const Bus = new Vue();
  3. /**
  4. * 同级组件通讯,提交事件
  5. * @param {String} component 要提交的目标组件名称
  6. * @param {string} action 要调用目标组件的方法名
  7. * @param {any} param 目标组件的方法参数
  8. */
  9. export const BusEmit = (component, action, param) => {
  10. Bus.$emit(component, action, param);
  11. };
  12. /**
  13. * 同级组件通讯,监听销毁事件
  14. */
  15. export const BusOn = {
  16. mounted() {
  17. Bus.$on(`${this.$options.name}`, this.onBusAction);
  18. },
  19. beforeDestroy() {
  20. Bus.$off(`${this.$options.name}`, this.onBusAction);
  21. },
  22. methods: {
  23. onBusAction(action, param) {
  24. log(`调用组件:${this.$options.name},方法:${action},参数:${param}`);
  25. this[action](param);
  26. }
  27. }
  28. };

2.需要监听事件的组件

引入 BusOn 挂载在组件的mixins上。


  1. import { BusOn} from "@/utils/BusEvent";
  2. export default {
  3. name: "app",
  4. mixins: [BusOn],
  5. methods: {
  6. show(is){
  7. console.log(is);
  8. }
  9. }

3.发起通讯的组件

引入 BusEmit 发起同级组件通讯。


  1. import { BusEmit} from "@/utils/BusEvent";
  2. export default {
  3. name: "child",
  4. methods: {
  5. emitShow(is){
  6. //大概意思:我要调用 app 组件的 show 方法,并且传了一个 true 的参数
  7. BusEmit("app","show",true)
  8. }
  9. }

好处:

  • 不用每个组件去引入Bus,然后在 mounted 监听,beforeDestroy 销毁(eventbus监听事件必须销毁),很繁琐。
  • 提供了良好的扩展,你想调用哪个组件,调用哪个方法,传递什么参数,很清晰。
  • 你可以在其他 js 文件 去引入并且调用组件的方法。

比如:在 htttp.js

省略了若干代码,定义了一个处理报错信息的函数。


  1. import { BusEmit } from "../utils/event-bus";
  2. **
  3. * 请求失败后的错误统一处理
  4. * * @param {Number} status 请求失败的状态码
  5. */
  6. const errorHandle = err => {
  7. //....省略
  8. BusEmit("app","toast",{
  9. text:'连接到服务器失败',
  10. time:1000,
  11. })
  12. }

当然你可以在 BusEvent.js 进行更多的封装,或者你有更好的思路,欢迎分享讨论。

原文地址:https://segmentfault.com/a/1190000016992424

seventBus(封装) 一个巧妙的解决vue同级组件通讯的思路的更多相关文章

  1. vue-concise-slider 一个轻量的vue幻灯片组件

    vue-concise-slider 一个轻量的vue幻灯片组件 阅读 541 收藏 35 2017-07-03 原文链接:github.com 外卖订单处理有烦恼?试试美团点评餐饮开放平台吧,可实现 ...

  2. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...

  3. 一个故事讲懂vue父子组件传值

    作者:李佳明同学链接:https://www.jianshu.com/p/2272b6ca0f0c 一个故事讲懂vue父子组件传值 讲故事前先讲代码 父组件向子组件传值 父组件数据传递给子组件可以通过 ...

  4. vue的组件通讯

    Vue的组件通讯又称组件传值 一.父子组件传值: 父组件: <子组件名   :动态变量名 (随便起)='你想要传递的数据' ></子组件名> 子组件: 利用 prop去接收父组 ...

  5. 使用vue.js封装一个包含图片的跑马灯组件

    初衷: 学习完Vuejs后,来准备练习仿写一下老东家的门户页面,主要是为了熟悉一下常用插件的使用,比如video.js,wow.js,swiper等等:而其中涉及到一个包含图片跑马灯组件,大概长这样( ...

  6. 封装一个优雅的element ui表格组件

    现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...

  7. vue同胞组件通讯解决方案(以下为一种另外可用vuex解决)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 深入理解Vue父子组件通讯的属性和事件

    在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 父子组件之间的 ...

  9. vue的组件通讯 父传子 -- 子传父-- 兄弟组件的传值 vue的组件传值

    首先文字简单撸一下 父子传子   -------首先在父组件上绑定一个属性,在子组件里用props接收,可以是数组或者是对象 子传父   ------在父组件升上自定义一个方法,在子组件里通过this ...

随机推荐

  1. 洛谷—— P1873 砍树

    https://www.luogu.org/problemnew/show/P1873 题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以 ...

  2. fastjson的序列化属性

    在将使用JSON.toJSONString(result, SerializerFeature.PrettyFormat)将JSONObject转化为字符串时,可以指定一些序列化属性,设置转化后的字符 ...

  3. Codeforces 471 D MUH and Cube Walls

    题目大意 Description 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. Input 第一行给出数字N.N在[2,1000000 ...

  4. 【GitHub】删除GitHub上的文件

    想要删除已经提交上GitHub上的文件, 删除之后,如果这个文件夹下没有文件了,这个文件夹也会被删除! 并且在它的上层文件夹后面 有提示删除了这个文件的信息!!

  5. from: 关于RabbitMQ

    from: http://lynnkong.iteye.com/blog/1699684 1      什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种, ...

  6. C 标准库 - <signal.h>

    C 标准库 - <signal.h> 简介 signal.h 头文件定义了一个变量类型 sig_atomic_t.两个函数调用和一些宏来处理程序执行期间报告的不同信号. 库变量 下面是头文 ...

  7. 使用 xmllint 验证 odoo xml文件

    Odoo 源码包含了2个 relax ng 文件,也是odoo sa用来验证xml的正确性的. openerp/import_xml.rng openerp/addons/base/rng/view. ...

  8. c# vitural

    virtual关键字用于指定属性或方法在派生类中重写. 默认情况下,派生类类从其基类继承属性和方法,如果继承的属性或方法需要在派生类中有不同的行为,则可以重写它,即可以在派生类中定义该属性或方法的新实 ...

  9. python(34)- 模块与包练习

    创建如下目录结构 keystone/ ├── __init__.py └── auth     ├── __init__.py     └── plugins         └── core.py ...

  10. 显卡接口PCI、VGA、PCIE

    转:1.PCIe扫盲系列博文连载 2.http://blog.sina.com.cn/s/blog_a73f94190102w2j2.html 1.AGP(Accelerated Graphics P ...