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 相关文章推荐
Js四则运算函数代码
Jul 21 Javascript
js实现的折叠导航示例
Nov 29 Javascript
javascript中数组的concat()方法使用介绍
Dec 18 Javascript
jQuery过滤选择器详解
Jan 13 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
了解javascript中let和var及const关键字的区别
May 24 Javascript
js如何获取访问IP、地区、当前操作浏览器
Jul 23 Javascript
vue与iframe之间的信息交互的实现
Apr 08 Javascript
你准备好迎接vue3.0了吗
Apr 28 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
php5.3 注意事项说明
2013/07/01 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
angular.element方法汇总
2015/01/07 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python中IPYTHON入门实例
2015/05/11 Python
python线程、进程和协程详解
2016/07/19 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Python中格式化字符串的四种实现
2020/05/26 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
AURALog面试题软件测试方面
2013/10/22 面试题
店长岗位的工作内容
2013/11/12 职场文书
项目合作计划书
2014/01/09 职场文书
担保书怎么写 ?
2019/04/22 职场文书