vue总线机制(bus)知识点详解


Posted in Javascript onMay 10, 2020

vue中非父子组件之间通信除了使用vuex,也可以通过bus总线,两者适用场景不同。

bus适合小项目、数据被更少组件使用的项目,对于中大型项目 数据在很多组件之间使用的情况 bus就不太适用了。bus其实就是一个发布订阅模式,利用vue的自定义事件机制,在触发的地方通过$emit向外发布一个事件,在需要监听的页面,通过$on监听事件。

vuex适用中大型项目、数据在多组件之间公用的情况。

简单介绍两者的区别之后,就要介绍下我在一个项目中遇到的一个场景了,这个场景使用bus可能更加适合些:

vue总线机制(bus)知识点详解

//main.js
 
Vue.prototype.bus = new Vue();
new Vue({
 render: h => h(App)
  ...
}).$mount('#app');
/*
*通过把一个vue实例赋于Vue构造函数原型上的一个属性bus(当然起任何名称都是可以的)
*而每个Vue实例都是有$emit和$on方法的
*由于bus属性在Vue原型上,根据原型链查找规则,在页面中我们就可以通过 this.bus.$emit 和 
*this.bus.$on来进行跨组件通信了
*/
//导航栏组件中
//点击事件发生时发布一个事件
this.bus.$emit('even-name',args1, arg2 , ...)
 
//这里我们可以把点击导航的相关信息携带出去
//路由显示页面中
this.bus.$on('event-name', (...args) => {
  //根据参数来进行路由跳转
})

这个事件监听 和 路由跳转的逻辑我们可以弄成一个mixins进行复用。到这样就完成了。

但是这样还是有点麻烦,每个页面都需要引入mixins,有没有更好的办法呢?答案是肯定的。我们项目导航栏是通过路由meta循环出来的,每项有对应导航栏的路由,结构如下:

{
  path: '/xxxx',
  component: xxxx,
  meta: [
   {
    name: '导航1'
   }, 
   {
    name: '导航2',
    url: '我是导航2的路由'
   },
   {
    name: '导航3',
    url: '我是导航3的路由'
   },
   {
    name: '导航4',
   }
  ]
 },

在思索时我忽然发现每个导航栏的index、导航栏长度length、及router.go方法之间有一个规律,那就是我们可以把index + 1 - length作为router.go的参数,从而不用再关心query参数了,而且只需要在导航栏组件操作一次就可以了,完美!

//导航栏组件点击事件处理函数中
 
if (url) {
  const meta = this.$route.meta;
  this.$router.go(index + 1 - meta.length)
}

知识点补充:

将Bus注入到Vue根对象中

import Vue from 'vue'
const Bus = new Vue()

var app= new Vue({
  el:'#app',
 data:{


Bus
  }


})

在子组件中通过this.$root.Bus.$on(),this.$root.Bus.$emit()来调用

以上就是vue总线机制(bus)知识点详解的详细内容,更多关于vue中总线机制的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript new 需不需要继续使用
Jul 02 Javascript
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
js实现照片墙功能实例
Feb 05 Javascript
JQuery中DOM加载与事件执行实例分析
Jun 13 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
May 19 Javascript
JS常用知识点整理
Jan 21 Javascript
javascript ES6中箭头函数注意细节小结
Feb 17 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 Javascript
layui 对table中的数据进行转义的实例
Sep 12 Javascript
JS实现前端路由功能示例【原生路由】
May 29 Javascript
vue路由跳转传递参数的方式总结
May 10 #Javascript
javascript单张多张图无缝滚动实例代码
May 10 #Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
May 10 #Javascript
js实现文章目录索引导航(table of content)
May 10 #Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 #Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 #Javascript
webpack+vue.js构建前端工程化的详细教程
May 10 #Javascript
You might like
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
php验证码生成代码
2015/11/11 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
Python3计算三角形的面积代码
2017/12/18 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
python装饰器代替set get方法实例
2019/12/19 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
Python中的__init__作用是什么
2020/06/09 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
医护人员英文求职信范文
2013/11/26 职场文书
教师读书活动总结
2014/05/07 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
话题作文之诚信
2019/11/28 职场文书