组件间的事件通信

在大多数页面里,组件通常需要相互通信,以完成某些任务或者交互。而在组件的定义里,每个组件是唯一且独立的, 每个组件实例的生成,并无法准确定位到另一个实例。所以我们建立一个全局事件中心,通过进行组件事件的绑定配置,准确的进行组件通信。

实现思路

  1. 页面初始化完成后,进行事件的初始化。初始化内容如下
  • 初始化emitAll事件。(任何事件触发都会是广播通知到所有组件。在组件外部会进行拦截是否是有效事件)
  • 查询所有组件是否有绑定event, 如果存在则注册到事件中心。这里会用组件id作为事件名,所以可以确保唯一
  • 组件触发emit事件后,会拿到需要触发的回调函数,进行广播通知。
  • 组件外部拦截判断是否是当前组件有效事件。如果有效,那么会传递到组件内部。(当前需要接收事件的组件内部存在处理逻辑,后续会优化提取到外部或者通过配置生效)

逻辑图如下。

  • A组件通知事件过滤层
  • A的事件过滤层通知EventCenter。
  • EventCenter通知到组件ABC的事件过滤层
  • AB的事件过滤层发现这个消息是通知C的,选择忽略
  • C的事件过滤层层发现是要告诉C的。立马通知C
  • C组件C到消息,马上执行!

事件中心代码

事件中心的代码很简单。核心的是,事件的注册时机和监听时期。

注册时机: 组件加载完成后

监听时期:事件绑定后

kotlin 复制代码
/**
 * 事件注册与响应中心
 * 主要处理: 1.注册事件 2.记录事件匹配关系 每个发送者都是接受者 3.统一在此处调度
 */

class eventCenter {

  constructor(config) {
    // 配置列表
    this.config = config || {};
    this.events = {};
  }

  // 注册
  register(event, callback) {
    if (!this.events[event]) {
      this.events[event] = {};
    }
    // 存储一个对象 每一个key就是一个事件
    this.events[event] = callback;
  }

  // 监听
  emit(event, args) {
    if (!this.events[event]) {
      return;
    }
    const cbs = this.events[event];
    // 通知到所有
    this.onAllCb(event, cbs, args)
  }

  // 监听所有
  emitAll(callback) {
    this.onAllCb = callback;
  }

  // 触发
  remove(event, callback) {
    if (!this.events[event]) {
      return;
    }
    this.events[event] = {};
    callback();
  }
}

export default eventCenter;
相关推荐
0思必得06 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5166 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino7 小时前
图片、文件的预览
前端·javascript
layman05289 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔9 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李9 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN9 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒9 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库9 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052479 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫