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 相关文章推荐
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
Dec 17 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
javascript实现类似java中getClass()得到对象类名的方法
Jul 27 Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
详解JavaScript中this的指向问题
Jan 20 Javascript
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
Node.js JSON模块用法实例分析
Jan 04 Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php数组合并的二种方法
2014/03/21 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
python zip()函数使用方法解析
2019/10/31 Python
Python实现微信好友的数据分析
2019/12/16 Python
python如何对链表操作
2020/10/10 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
安全责任协议书范本
2016/03/23 职场文书