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 add event remove event
Apr 07 Javascript
jQuery 解析xml文件
Aug 09 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
react-router4 嵌套路由的使用方法
Jul 24 Javascript
分享Bootstrap简单表格、表单、登录页面
Aug 04 Javascript
通过封装scroll.js 获取滚动条的值
Jul 13 Javascript
详解mpvue scroll-view自动回弹bug解决方案
Oct 01 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
vue实现PC端录音功能的实例代码
Jun 05 Javascript
小程序中的箭头函数的具体使用
Jun 19 Javascript
vue实现简易的双向数据绑定
Dec 29 Vue.js
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入门速成教程
2007/03/19 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
PHP的几个常用加密函数
2016/02/03 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
tab栏切换原理
2017/03/22 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
从运行效率与开发效率比较Python和C++
2018/12/14 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
this关键字的含义
2015/04/08 面试题
教育孩子心得体会
2014/01/01 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
服装设计师求职信
2014/06/04 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
医院病假条怎么写
2015/08/17 职场文书
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis