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 checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
Feb 27 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
Jul 11 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
JS 实现 ajax 异步浏览器兼容问题
Jan 21 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
angular4中关于表单的校验示例
Oct 16 Javascript
简述vue中的config配置
Jan 23 Javascript
基于mpvue的小程序项目搭建的步骤
May 22 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
微信小程序页面传多个参数跳转页面的实现方法
May 17 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作为Shell脚本语言使用
2006/10/09 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
PHP设置进度条的方法
2015/07/08 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
物理教师自荐信范文
2013/12/28 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
实践单位评语
2014/04/26 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
新员工入职感想
2015/08/07 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python