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 相关文章推荐
formValidator3.3的ajaxValidator一些异常分析
Jul 12 Javascript
Jquery带搜索框的下拉菜单
May 06 Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 Javascript
JS创建自定义表格具体实现
Feb 11 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
深入探讨javascript中的数据类型
Mar 04 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
Sep 22 jQuery
vue 详情跳转至列表页实现列表页缓存
Mar 27 Javascript
Vue打包后访问静态资源路径问题
Nov 08 Javascript
原生js实现无缝轮播图
Jan 11 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学习之 数组声明
2011/06/09 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
vue组件间通信解析
2017/03/01 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
浅析python标准库中的glob
2020/03/13 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
英语专业学子个人的自我评价
2013/10/02 职场文书
护理学中专毕业生求职信
2013/11/11 职场文书
艺术应用与设计个人的自我评价
2013/11/23 职场文书
职位说明书范文
2014/05/07 职场文书
2016新年慰问信范文
2015/03/25 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
趣味运动会标语口号
2015/12/26 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
python中pandas对多列进行分组统计的实现
2021/06/18 Python
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android