最近两天在面试中被提及到vue组件通信的几种方式,这些都是巴拉巴拉的一堆网上可以百度到的通信方式,比如父子组件间的props和$emit,以及$refs,$children,$parent, 依赖注入,vuex,以及bus事件总线机制,因为提到了这个bus,所以面试官就问你知道bus的实现原理吗?在我之前的想法中我认为就是通信方式除了vuex需要去掌握一下原理外,其他的都是知道怎么用就好了,但是当面试官突然这么一问之后,我也突然一蒙蔽了,毕竟自己确实不知道。

基于上述原因,我现在慢慢的觉得程序的东西不仅仅需要知道怎么用,当然第一步是需要知道怎么使用,接下来就是要知道如何去实现这个技术或者插件,之前挺喜欢一位老师说的名句就是“了解真相才能获得真正的自由”

正文开始:vueBus是中央数据总线,是为了解决非关系组件间的通信问题,主要是使用了vue中的$on和$emit方法,使用发布者订阅者模式,必须在相同的实例才可以进行数据响应,中央数据总线可以使用空的vue实例来实现,有一个cache对象,使用$on新增订阅方法,通过$off进行订阅方法的删除,通过$emit实现通知订阅信息的更新。

其实bus等同于以下写法:创建一个Bus函数,创建两个方法和一个存储对象,通过$on收集依赖,通过$emit触发依赖方法。

class Bus {constructor() {this.callbacks = {}}$on(name, fn) {this.callbacks[name] = this.callbacks[name] || []this.callbacks[name].push(fn)}$emit(name, args) {if (this.callbacks[name]) {this.callbacks[name].forEach(cb => cb(args))}}
}
// main.js
Vue.prototype.$bus = new Bus()
// child1
this.$bus.$on('foo', handle)
// child2
this.$bus.$emit('foo')

vueBus注意事项:

  1. $bus.on应该在created钩子内使用,如果在mounted使用,它可能接收不到其他组件来自created钩子内发出的事件,

  2. 使用了$bus.on在beforeDestory钩子里应该需要使用$bus.off解除

顺带记得关注公众号一波分享你需要的资源

Vue-你不知道的Bus中央数据总线学习相关推荐

  1. 关于vue中bus中央数据总线传值的坑

    官网这个方法是非父子组件之间的传值,用了之后才发现父子组件其实也可以用this.bus.$emit('xxx',data) 和 this.bus.$on('xxx',(data)=>{}) .但 ...

  2. Vue.js实战之系统学习第七节

    想看上一节的请点击: Vue.js实战之系统学习第六节 接下来我们要学习第七节了,时间过的好快. 组件详解 组件是Vue.js的核心功能,也是整个框架设计最精彩的地方,当然也是最难掌握的.本章节将带你 ...

  3. Vue 生命周期记录_学习笔记

    官方给出的设计图入戏 为了能更好的理解这个图呢,写了下面的demo <!DOCTYPE html> <html><head><meta charset=&qu ...

  4. Vue中bus的使用

    vue总线机制(bus) vue中非父子组件之间通信除了使用vuex,也可以通过bus总线,两者适用场景不同. bus适合小项目.数据被更少组件使用的项目,对于中大型项目 数据在很多组件之间使用的情况 ...

  5. vue 双向数据绑定的实现学习(一)

    前言:本系列学习笔记从以下几个点展开 什么是双向数据绑定 双向数据绑定的好处 怎么实现双向数据绑定 实现双向数据数据绑定需要哪些知识点 数据劫持 发布订阅模式 先看看我们要实现的目标是什么,如下动图: ...

  6. vue项目打包与配置-学习笔记

    文章目录 vue项目打包与配置-学习笔记 前端打包 打包的代码如何运行 打包指定不同的环境变量(开发,测试) 打包手动配置文件 打包压缩,大文件处理 gzip进一步压缩 打包app 打包部署模式 vu ...

  7. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  8. vue、bus 使用遇到的坑,组件之间无法传值;vue、bus 第一次获取不到值,后面再点击重复执行

    vue.bus 使用遇到的坑,组件之间无法传值:vue.bus 第一次获取不到值,后面数据叠加 问题定位: 出现无法传值的情况,检查传值过程中组件是否还没有渲染:可能出现的情况是:组件被if,在你使用 ...

  9. Vue.js实战之系统学习第一节

    为什么叫系统学习呢?因为我以前接触过Vue.js,但是没学过它的原理,只是简单的使用了,使用的时候就觉得很好用,没有其他的什么感觉,但当我进入职场后,学习了很多的前端技术后,才发现这个技术的友好,被它 ...

最新文章

  1. 字符串的html语言,html语言解析为属性字符串NSMutableAttributedString
  2. 「学习笔记」多项式相关
  3. 后Hadoop时代的大数据技术思考:数据即服务
  4. java中的深度克隆浅克隆_了解Java中的可克隆接口
  5. 从线上慢sql看explain关键字
  6. linux属性表示的文件,Linux基础入门:文件和目录属性的含义
  7. Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode(
  8. flash实验中需添加的flash.c文件
  9. 做网站用企业网站模板好不好
  10. php读取写入,php操作文件(读取写入文件)
  11. PR字幕不显示的问题(已解决)
  12. css用网络图片做背景图片,网络编程css为图片设置背景图片
  13. 微信小程序 地图组件标记文字
  14. 计算机机房装修效果图,机房装修施工流程是什么? 机房装修效果图
  15. CommandNotFoundError: No command ‘conda activate‘
  16. DLNA介绍(包括UPnP)
  17. 自然语言处理(5)——语言模型
  18. 网络攻击之信息收集阶段
  19. AIDE-Libgdx导入Box2d
  20. 3D引擎Axiom的选择与学习

热门文章

  1. win7原版镜像_win10如何退回win7系统
  2. 【工具】批量修改文件名
  3. 常用的英文缩写和短信缩写
  4. 多次成功创业经验总结-我如何打造新品类战略公式
  5. HDU 3068 2017 Multi-University Training Contest - Team 1 1006 Fuction: 循环节+最后一步
  6. 网店卖什么产品最好卖?
  7. 国密SSL协议之双证书体系
  8. MySQL数据库之GROUP BY用法
  9. qq令牌码怎么提取_QQ空间怎么引流?
  10. 学校计算机室应该配备哪种灭火器,学校灭火器配备标准