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技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 Javascript
开发中可能会用到的jQuery小技巧
Mar 07 Javascript
jquery对象和javascript对象即DOM对象相互转换
Aug 07 Javascript
javascript实现简单的鼠标拖动效果实例
Apr 10 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 Javascript
vue路由插件之vue-route
Jun 13 Javascript
redux处理异步action解决方案
Mar 22 Javascript
如何在JavaScript中使用localStorage详情
Feb 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
解析CodeIgniter自定义配置文件
2013/06/18 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
python 用下标截取字符串的实例
2018/12/25 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
三八妇女节活动主持词
2014/03/17 职场文书
继承权公证书
2014/04/09 职场文书
房屋出售协议书
2014/04/10 职场文书
作文批改评语
2014/12/25 职场文书
春秋淹城导游词
2015/02/11 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
Django实现翻页的示例代码
2021/05/24 Python