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 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
js控制href内容的连接内容的变化示例
Apr 30 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
wap手机端解决返回上一页的js实例
Dec 08 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
Dec 19 Javascript
JS实现图片放大缩小的方法
Feb 15 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
Sep 14 Javascript
JS实现指定区域的全屏显示功能示例
Apr 25 Javascript
开发中常用的25个JavaScript单行代码(小结)
Jun 28 Javascript
小程序实现图片移动缩放效果
May 26 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
SONY ICF-F10中波修复记
2021/03/02 无线电
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
总结一些js自定义的函数
2006/08/05 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现给数组按片赋值的方法
2015/07/28 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Java及python正则表达式详解
2017/12/27 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
Python理解递归的方法总结
2019/01/28 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
python访问hdfs的操作
2020/06/06 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
单位工作证明范本
2015/06/15 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL