在Vue3+TypeScript 前端项目中使用事件总线Mitt
事件总线Mitt使用非常简单,本篇随笔介绍在Vue3+TypeScript 前端项目中使用的一些场景和思路。我们在Vue 的项目中,经常会通过emits 触发事件来通知组件或者页面进行相应的处理,不过我们使用事件总线Mitt来操作一些事件的处理,也是非常方便的。
Mitt 的GitHub官网地址如下所示:https://github.com/developit/mitt, 它的安装和其他插件一样,我们不再赘述,只讲述它的如何使用。
Mitt
具有以下优点:
- 零依赖、体积超小,压缩后只有
200b
。 - 提供了完整的
typescript
支持,能自动推导出参数类型。 - 基于闭包实现,没有烦人的
this
困扰。 - 为浏览器编写但也支持其它
javascript
运行时,浏览器支持ie9+
(需要引入Map
的polyfill
)。 - 与框架无关,可以与任何框架搭配使用。
import mitt from 'mitt'
const emitter = mitt() // 订阅一个具体的事件
emitter.on('foo', e => console.log('foo', e) ) // 订阅所有事件
emitter.on('*', (type, e) => console.log(type, e) ) // 发布一个事件
emitter.emit('foo', { a: 'b' }) // 根据订阅的函数来取消订阅
function onFoo() {}
emitter.on('foo', onFoo) // listen
emitter.off('foo', onFoo) // unlisten // 只传一个参数,取消订阅同名事件
emitter.off('foo') // unlisten // 取消所有事件
emitter.all.clear()
而我们如果在Vue3 + TypeScript 环境中使用的话,就需要类型化事件的类型,已达到强类型的处理目的。
import mitt from "mitt"; type Events = {
foo: string;
bar: number;
}; // 提供泛型参数让 emitter 能自动推断参数类型
const emitter = mitt<Events>(); // 'e' 被推断为string类型
emitter.on("foo", (e) => {
console.log(e);
}); // ts error: 类型 string 的参数不能赋值给类型 'number' 的参数
emitter.emit("bar", "xx"); // ts error: otherEvent 不存在与 Events 的key中
emitter.on("otherEvent", () => {
//
});
在前端项目使用的时候,我们在utils/mitt.ts中定义默认导出的mitt对象,如下代码所示。
// utils/mitt.ts import mitt, { Emitter } from 'mitt'; // 类型
const emitter: Emitter<MittType> = mitt<MittType>(); // 导出
export default emitter;
在其中的MittType类型,可以单独文件放置TypeScript的预定义文件目录中,如types/mitt.d.ts
而我们在使用的时候,直接导入该对象就可以了,如下代码所示。
declare type MittType<T = any> = {
openSetingsDrawer?: string;
restoreDefault?: string;
setSendColumnsChildren: T; .................. //省略其他事件类型 noticeRead: number; // 消息已读事件
lastAddParentId?: string | number;//新增记住最后的父信息
};
例如我们定义一个更新和记住父菜单的Mitt 事件,在页面加载完毕的时候监听事件,在页面退出的时候关闭事件即可,如下代码所示是在菜单列表页面中处理的。
<script lang="ts" setup name="sysMenu">
import { onMounted, onUnmounted, reactive, ref } from 'vue';
import mittBus from '/@/utils/mitt';
......
onMounted(async () => {
handleQuery(); mittBus.on('submitRefresh', () => {
handleQuery();
});
mittBus.on('lastAddParentId', (pid) => {
state.lastAddParentId = pid as string;//记住最后的父菜单ID
});
}); onUnmounted(() => {
mittBus.off('submitRefresh');
mittBus.off('lastAddParentId');
}); </script>
在新增菜单的时候我们触发对应刷新事件 submitRefresh,以及触发选择的父记录ID的事件 lastAddParentId,这样就可以做相应的处理了。
例如在菜单的编辑子控件页面中,我们触发对应的事件逻辑代码如下所示。
// 关闭弹窗
const closeDialog = () => {
mittBus.emit('submitRefresh');
state.isShowDialog = false;
}; // 提交
const submit = () => {
ruleFormRef.value.validate(async (valid: boolean) => {
if (!valid) return;
if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
await menuApi.update(state.ruleForm);
} else {
await menuApi.add(state.ruleForm);
//记住最后的菜单
mittBus.emit('lastAddParentId', state.ruleForm.pid);
}
closeDialog();
});
};
如果为了减少每次重复的导入mitt,也可以把它全局挂载到变量中,统一入口进行访问,详细可以参考随笔《在基于vue-next-admin的Vue3+TypeScript前端项目中,为了使用方便全局挂载的对象接口》处理即可。
const $u: $u_interface = {
message,
test,
util,
date,
crypto,
base64,
$t: i18n.global.t,
fun: commonFunction(), cloneDeep,
debounce,
throttle,
mitt
}; //安装$u组件到app上
import type { App } from 'vue';
export default {
install(app: App<Element>) {
// 挂载全局
app.config.globalProperties.$u = $u;
}
};
在Vue3+TypeScript 前端项目中使用事件总线Mitt的更多相关文章
- 在Vue前端项目中,附件展示的自定义组件开发
在Vue前端界面中,自定义组件很重要,也很方便,我们一般是把一些通用的界面模块进行拆分,创建自己的自定义组件,这样操作可以大大降低页面的代码量,以及提高功能模块的开发效率,本篇随笔继续介绍在Vue&a ...
- 前端项目中使用jsencrypt进行字段加密
前端项目中使用jsencrypt进行字段加密. 使用步骤:①获取公钥②实例化对象③设置公钥④将所需数据进行加密然后返回. 进行一个简单的封装如下 /** * npm install jsencrypt ...
- 在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在我的<FastReport报表随笔>介绍过各种FastReport的报表设计和使用,FastReport报表可以弹性的独立设计格式,并可以在Asp.net网站上.Winform端上使用, ...
- 在Vue&Element前端项目中,对于字典列表的显示处理
在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...
- 在typeScript+vue项目中使用ref
因为vue项目是无法直接操作dom的,但是有时候开发需求迫使我们去操作dom. 两个办法,一个是很low的再引入jq,然后通过jq来操作,但是这样就失去了我们使用vue的意义, 可惜的是我曾经这样干过 ...
- 如何在前端项目中引用bootstrap less?
在基于bootstrap css框架的前端项目开发中,如果有grunt build系统,那么工作流是:客制化less,在less中定义自己的 CSS,同时可以随意引用bootstrap中预定义好的cs ...
- 前端项目中gulp的使用
在公司项目开发中,有一个前端项目,我们使用gulp来生成目标文件(css,js,html文件) 进入到这个项目目录中 C:\My Project\FrontEnd\TestBuilder 然后依次运 ...
- web前端项目中遇到的一些问题总结(08.23更新)
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 写一些最近工作中Vue项目中遇到的问题. 巴啦啦小魔仙,污卡拉,全身变,小 ...
- 前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)
开门见山,本文分享前后端分离,容器化前端项目时动态插入后端API基地址,这是一个很赞的实践,解决了前端项目容器化过程中受制后端调用的尴尬. 尴尬从何而来 常见的web前后端分离:前后端分开部署,前端项 ...
- vue3+ts 全局事件总线mitt
Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...
随机推荐
- RN 手势响应系统基本用法和获取坐标判断用户手势方向
1. 基本使用,注意两点 (1)将手势系统的函数放在"componentWillMount"生命周期函数里面,当时会有警告,警告自己看吧 (2)将方法使用ES6扩展运算符展开 im ...
- 基于rabbitmq之MQTT协议的智能家居
智能家居项目 智能可燃气体报警器 产品是一款可燃气体报警器,如果家中燃气泄露浓度到达一定阈值,报警器检测到并上传气体浓度值给后台,后台以电话.短信.微信等方式,提醒用户家中可能有气体泄漏. 用户还可能 ...
- 解决eclipse创建动态Web项目没有Web->Dynamic Web Project问题
有时候在eclipse新建Dynamic Web Project,File->New->Other->Web并没有发现Dynamic Web Project选项如下图:(那也不要慌解 ...
- centos8 安装 spdk
1. 下载 2.配置 ./configure --enable-debug --disable-tests --without-isal --without-ocf --with-uring --w ...
- 使用fontmin,压缩字体文件,从十几M到几kb,只选择需要使用的文字
字体文件压缩fontmin,大幅压缩字体文件 快速熟练fontmin的使用,只需要在代码中配置文章中需要用到的文字,可以大幅度缩减代码大小 安装 npm install fontmin 目录结构 sr ...
- echarts属性大全
// 全图默认背景 // backgroundColor: 'rgba(0,0,0,0)', // 默认色板 color: ['#ff7f50','#87cefa','#da70d6','#32cd ...
- Java数据类型基础
Java 数据类型基础 数据类型 强类型语言 要求变量的使用要严格符合规定,所有变量必须先定义后使用 Java数据分为两大类 基本类型(primitive type) 数值类型 整数类型 byte(1 ...
- Rsync+NFS实战,解决NFS单点问题
1.环境准备 主机 ⻆⾊ ip web01 NFS客户端.RSYNC客户端 172.16.1.7 nfs NFS服务端.RSYNC客户端 172.16.1.31 backup NFS服务端.RSYNC ...
- JavaScript ES6 类和对象 简单记录
一/*1.在ES6之前如果定义一个类?通过构造函数来定义一个类*/ function Person(myName, myAge) { // 实例属性 // this.name = "lnj& ...
- 开发者工具与idea代码缺失
开发者工具与idea代码缺失 当categoryList为空时,<dd></dd>之间显示结果为无,所以开发者工具也无这段代码.