首页 > 其他分享 >前端组件通信工具-自定义Bus

前端组件通信工具-自定义Bus

时间:2023-09-26 10:22:40浏览次数:55  
标签:name 自定义 Bus list value 组件 string

前端组件通信工具-自定义Bus

在utils添加Bus

// 先定义一个类型,emit作为发布(传递),on作为订阅(接收)
// name是事件名称,callback是一个回调函数
type BusClass = {
    emit:(name:string) => void
    on:(name:string, callback:Function) => void
    off:(name:string) => void
}
// 定义多种参数类型
type PramsKey = string | number | symbol
// 定义一个调用中心,可以接收多个参数
type List = {
   [key:PramsKey]: Array<Function>
}
class Bus implements BusClass {
    list: List
    constructor (){
        // 初始化list
        this.list = {}   
    }
    // 发布事件,...args解构多个参数
    emit (name:string,...args:Array<any>){
        // 获取到list里的数据
        let evnentName:Array<Function> = this.list[name]
        evnentName.forEach(fn =>{
            fn.apply(this, args)
        })
    }
    // 接收事件
    on (name:string, callback:Function){
        // 如果是第一次注册,则为空;如果被多次注册,则采用之前注册的名字
        let fn:Array<Function> = this.list[name] || []
        fn.push(callback)
        this.list[name] = fn
    }
    //卸载事件(每次使用完后需要在组件销毁前,清除事件,否则会多次触发事件)
    off (name:string){
        this.list = {}
    }
}
// 导出bus
export default new Bus()

在需要使用的组件中引入

import Bus from "@/utils/bus";

在任意组件或方法中触发事件

 //searchOpinionData触发事件的名字,标识,searchFrom.value触发事件需要传递的数据
Bus.emit("searchOpinionData", searchForm.value);

触发后接收执行

Bus.on("searchOpinionData", (data) => {
    //做一系列操作1
  searchStr.value = data.search;
  searchType.value = data.treeType;
  currentPage.value = 1;
  getOpinionList();
  // 搜索时,不管是否有数据都渲染(空数据同样渲染)
  isLoading.value = true;
    
});

这样已经基本完成啦

此时存在的问题,多次进入组件再次触发Bus时会多次执行 做一系列操作1中的操作,于是乎在组件卸载前需要卸载bus中的事件

import { onBeforeUnmount } from "vue";

onBeforeUnmount(() => {
  //组件销毁前需要解绑事件。否则会出现重复触发事件的问题
  Bus.off("searchOpinionData");
});

标签:name,自定义,Bus,list,value,组件,string
From: https://www.cnblogs.com/sxliu414/p/17729531.html

相关文章

  • Qt PLC Modbus通信
    项目介绍有一个项目需要PC和PLC通信,PLC通信协议是Modbus协议。前两天研究了一下,QT源码也有例程,不过源码读了有点懵,参考了别人的博客,实现了一个简单的通信Demo,测试可以对PLC内部寄存器和中间继电器读写。软件版本和程序总览QT:5.12.12Kits:MSVC2017PLC:信捷XD5软件预览:软件介绍......
  • 界面组件DevExpress VCL v23.2新功能预览 - 支持Windows 11
    距离DevExpressVCL 下一个主要更新(v23.2)还有几个月的时间,本文将为大家描述预计在12月初为激活的DevExpressVCL用户发布的一些功能。正如你将在下面看到的,重点领域将继续保持高DPI/SVG和Windows11的支持。DevExpressVCL所包含的控件有:数据录入、图表、数据分析、导航、布局......
  • Hadoop是什么? Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......
  • 使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理
    目录1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整1、前言最近在做一个文件夹管理的功能,要实现一个树状的文件夹面板。里面包含两种元素,文件夹以及文件。交互要求如下:创建、删除,重命名文件夹和文件可以拖拽,拖拽文件到文件夹中,或......
  • 金蝶云星空自定义WebApi
     1、创建项目,命名规范:开发商.K3.SCM.WebApi.ServicesStub 2、添加引用 usingKingdee.BOS.ServiceFacade.KDServiceFx;usingKingdee.BOS.WebApi.ServicesStub;3、新建类,继承webapi业务抽象服务AbstractWebApiBusinessService。///<summary>///......
  • uni 组件自带方法怎么传自定义参数下去
    html<pickermode="selector"class="pickers"@change="PickerLittleChange($event,operatingState)" :value="indexs"range-key="dictLabel":range="operatingState"> <viewclas......
  • 一文介绍清楚自定义表单开源的相关功能
    用什么样的软件平台可以让办公无压力,实现流程化发展?随着社会的进步发展,传统的办公工具已经不能满足办公需求了,需要借助低代码技术平台的优势特点,实现流程化办公。一款自定义表单开源工具,可以能让很多客户朋友完成高效率办公协作,顺利朝着数字化发展的方向迈进。什么样的服务商拥有......
  • OpenHarmony自定义组件介绍
     一、创建自定义组件在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成......
  • OpenHarmony自定义组件介绍
    一、创建自定义组件在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行UI界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组......
  • 【ElementUI】ElementUI Tooltip 根据内容判断是否显示、文字提示自定义样式
    【ElementUI】ElementUITooltip根据内容判断是否显示、文字提示自定义样式封装组件自定义内容<template><spanv-if="['',null,undefined].indexOf(content)===-1"><el-tooltip:content="content"effect="light"placement="bot......