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 相关文章推荐
jquery validate.js表单验证的基本用法入门
May 13 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
Jul 15 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
JS实现倒计时和文字滚动的效果实例
Oct 29 Javascript
跟我学习javascript的基本类型和引用类型
Nov 16 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
Jul 11 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
JavaScript this使用方法图解
Feb 04 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 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
杏林同学录(七)
2006/10/09 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
实例讲解php实现多线程
2019/01/27 PHP
js清理Word格式示例代码
2014/02/13 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python多线程之事件Event的使用详解
2018/04/27 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python简单I/O操作示例
2019/03/18 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
python为什么会环境变量设置不成功
2020/06/23 Python
python中二分查找法的实现方法
2020/12/06 Python
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
卫校中专生的自我评价
2014/01/15 职场文书
毕业论文致谢词
2015/05/14 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS