组件通信BUS模式及原理

简介: vue组件通信方式是个老生常谈的话题了,最全面的莫过于 vuex,最简单的就是父子组件 props 传值,今天我们重点来说说经常提到的 bus 模式。

vue组件通信方式是个老生常谈的话题了,最全面的莫过于 vuex,最简单的就是父子组件 props 传值,今天我们重点来说说经常提到的 bus 模式。


bus使用


  1. 使用Vue创建新实例
Vue.prototype.$bus = new Vue();
复制代码

$bus 实际就是个 Vue 实例对象



  1. 定义事件监听函数
// A.vue
created() {
  this.$bus.$on('setName', (name) => {
    console.log('receive:' + name)
  })
}
复制代码

  1. 触发事件
// B.vue
mounted() {
  this.$bus.$emit('setName', 'Job')
}
复制代码

  1. 移除事件
// A.vue
destroyed() {
  this.$bus.$ff('setName')
}
复制代码


我们在这边只传递了一个事件名参数 setName,这时会移除所有的 setName 监听函数,在实际使用的时候,我们一般会添加第二个参数来指定移除的监听函数


this.$bus.$ff('setName', fn); // fn的指针地址需要和创建($on)添加的函数相同,这点和removeEventListener是一致的
复制代码


bus使用注意事项


bus模式实际是非常简单的,简单加上日常并不一定需要去使用,以至于我们经常忘记如何使用它。使用的时候有几个需要注意的点


  1. 在组件中使用 this.$bus 之前要先往原型上注册该实例 Vue.prototype.$bus = new Vue()

  2. 在触发事件 this.$bus.$emit(xxx) 之前应该先定义监听函数 this.$bus.$on(xxx, fn)

  3. 在组件销毁的时候,如有必要是需要移除事件的 this.$bus.$off(xxx, fn),不然会多次重复监听

bus模式的原理


知道 订阅发布模式 的一眼就能看出 bus 其实就是一个 订阅发布 的实现。通过 $on 添加订阅,通过 $emit 触发通知广播。关于订阅发布模式可以看看浅谈订阅发布实现vue


所以说,我们的 bus 模式实际是利用了 vue 中的一个 订阅发布 实现,我们通过实例方法 $on$emit$off 来触发 vue 是事件订阅中心。


我们接着来看看其源码部分


  1. $on


Vue.prototype.$on = function (event: string | Array<string>, fn: Function): Component {
  const vm: Component = this
  // 可以使用数组同时添加多个订阅
  if (Array.isArray(event)) {
    for (let i = 0, l = event.length; i < l; i++) {
      vm.$on(event[i], fn)
    }
  } else {
    // 订阅:往事件中心vm._events添加事件回调函数fn
    (vm._events[event] || (vm._events[event] = [])).push(fn)
    // ...
  }
  return vm
}
复制代码

  1. $emit
Vue.prototype.$emit = function (event: string): Component {
  const vm: Component = this
  // 先取事件中心的event类型回调函数
  let cbs = vm._events[event]
  if (cbs) {
    cbs = cbs.length > 1 ? toArray(cbs) : cbs
    const args = toArray(arguments, 1)
    const info = `event handler for "${event}"`
    // 依次触发事件回调函数fn
    for (let i = 0, l = cbs.length; i < l; i++) {
      invokeWithErrorHandling(cbs[i], vm, args, vm, info)
    }
  }
  return vm
}
复制代码



  1. $off
Vue.prototype.$off = function (event?: string | Array<string>, fn?: Function): Component {
  const vm: Component = this
  // 没有event参数将移除全部
  if (!arguments.length) {
    vm._events = Object.create(null)
    return vm
  }
  // 可移除事件数组
  if (Array.isArray(event)) {
    for (let i = 0, l = event.length; i < l; i++) {
      vm.$off(event[i], fn)
    }
    return vm
  }
  // 没有回调函数则直接退出
  const cbs = vm._events[event]
  if (!cbs) {
    return vm
  }
  // 没有fn参数将移除所有event类型回调
  if (!fn) {
    vm._events[event] = null
    return vm
  }
  // 移除特定事件
  // 可以发现只会移除第一个符合条件的函数
  let cb
  let i = cbs.length
  while (i--) {
    cb = cbs[i]
    if (cb === fn || cb.fn === fn) {
      cbs.splice(i, 1)
      break
    }
  }
  return vm
}
复制代码


总结


我们今天分析了bus模式的组件通信方式及其实现原理,整体比较简单 good good staduy day day up


目录
打赏
0
0
0
0
2
分享
相关文章
大数据处理流程包括哪些环节
大数据处理流程作为当今信息时代的关键技术之一,已经成为各个行业的必备工具。这个流程涵盖了从数据收集、存储、处理、分析到应用的各个环节,确保了数据的有效利用和价值的最大化。
|
9月前
|
SQL
简单练习Microsoft SQL Server MERGE同步两个表
【10月更文挑战第13天】本文介绍了在Microsoft SQL Server中使用`MERGE`语句同步两个表的步骤。首先创建源表`SourceTable`和目标表`TargetTable`并分别插入数据,然后通过`MERGE`语句根据ID匹配行,实现更新、插入和删除操作,最后验证同步结果。此方法可根据需求调整以适应不同场景。
362 1
canvas系列教程03 —— 线的样式、绘制文本、操作图片(图片的渲染、缩放、裁剪、切割、平铺、特效)、变换元素(平移、缩放、旋转)(二)
canvas系列教程03 —— 线的样式、绘制文本、操作图片(图片的渲染、缩放、裁剪、切割、平铺、特效)、变换元素(平移、缩放、旋转)(二)
212 0
深入浅出:微服务架构设计的艺术
在软件开发的广阔天地中,微服务架构如星辰般璀璨,它以小而美的服务单元,构建起复杂应用的宏伟蓝图。本文将带你领略微服务设计的精髓,从理论到实践,一步步揭开其神秘的面纱。你将学习到如何优雅地处理服务拆分、数据一致性和系统容错等关键问题,最终能够运用这些知识,打造出既灵活又稳定的微服务系统。
103 28
开源视频版GPT-4o?快速记忆,实时问答,拿下CVPR'24长视频问答竞赛冠军
【7月更文挑战第24天】Flash-VStream, 一款模拟人脑记忆的视频语言模型,实现实时长视频流理解和问答,夺得CVPR&#39;24竞赛桂冠。它采用动态记忆技术,高效存储检索信息,大幅降低推理延迟与显存消耗,超越现有模型。虽有资源限制及复杂查询处理难题,仍展现卓越通用性及先进性能。[详细论文](https://arxiv.org/abs/2406.08085)。
252 17
构建高性能后端系统的策略与实践
在数字化时代的浪潮中,后端系统作为支撑现代应用程序的核心,其性能的优劣直接影响用户体验和业务发展。本文将深入探讨如何构建一个既高效又可靠的后端系统,通过具体的策略和技术手段,指导读者理解并实施后端优化的最佳实践。我们将一起探索代码优化、数据库设计、缓存应用、异步处理以及负载均衡等关键领域,旨在帮助开发者打造能够应对高并发挑战的后端架构。 【7月更文挑战第27天】
196 5
Theta方法:一种时间序列分解与预测的简化方法
Theta方法整合了两个基本概念:分解时间序列和利用基本预测技术来估计未来的价值。
412 0
Nativefier——将网站打包成windows应用程序
Nativefier——将网站打包成windows应用程序
235 0
一文读懂Apache Beam:统一的大数据处理模型与工具
【4月更文挑战第8天】Apache Beam是开源的统一大数据处理模型,提供抽象化编程模型,支持批处理和流处理。它提倡"一次编写,到处运行",可在多种引擎(如Spark、Dataflow、Flink)上运行。Beam的核心特性包括抽象化概念(PCollection、PTransform和PipelineRunner)、灵活性(支持多种数据源和转换)和高效执行。它广泛应用在ETL、实时流处理、机器学习和大数据仓库场景,助力开发者轻松应对数据处理挑战。
2613 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问