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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
jQuery弹出(alert)select选择的值
Apr 21 Javascript
Jquery绑定事件(bind和live的区别介绍)
Aug 23 Javascript
jquery弹出框的用法示例(一)
Aug 26 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
JavaScript中的getDay()方法使用详解
Jun 09 Javascript
bootstrap datetimepicker日期插件使用方法
Jan 13 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
小程序根据手机机型设置自定义底部导航距离
Jun 04 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
在vue-cli创建的项目中使用sass操作
Aug 10 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实现将GB编码转换为UTF8
2006/11/25 PHP
PHP 日,周,月点击排行统计
2012/01/11 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
安装docker和docker-compose实例详解
2019/07/30 PHP
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
python实现bucket排序算法实例分析
2015/05/04 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
利用python 下载bilibili视频
2020/11/13 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
电大自我鉴定范文
2013/10/01 职场文书
英文版餐饮运营管理求职信
2013/11/06 职场文书
党员培训思想汇报
2014/01/07 职场文书
小学美术教学反思
2014/02/01 职场文书
人力资源总监工作说明
2014/03/03 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
毕业典礼主持词
2015/06/29 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python