Vue3使用mitt进行组件通信

mitt:事件总线,是第三方插件。

Vue2.x 使用 EventBus 事件总线进行兄弟组件通信,而在Vue3中 EventBus 事件总线模式已经被移除,官方建议使用外部的、实现了事件触发器接口的库,例如 mitttiny-emitter

比起 Vue 实例上的 EventBus,mitt.js 好在哪里呢?

  1. 首先它足够小,仅有200bytes。
  2. 其次支持全部事件的监听和批量移除。
  3. 它还不依赖 Vue 实例,可以跨框架使用,React 或者 Vue,甚至 jQuery 项目都能使用同一套库。

1、安装 mitt

npm install --save mitt

2、在公共文件 utils 下新建 mitter.ts文件,简单封装下 mitt

utils/mitter.ts

import mitt from 'mitt';const mitter = mitt();export default mitter;

在这里插入图片描述
在这里插入图片描述

3、使用

utils/request.ts

如果登录过期,派发 token-expired 事件。
在这里插入图片描述

import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { showMessage } from './errorCode';
import { alertController } from '@ionic/vue';
import { showToast } from '.';
import { StorageService } from './storageService';
import mitter from './mitter';let token: string = '';
// 是否显示重新登录
let isReloginShow: boolean = false;const storageService = new StorageService();
storageService.create();axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
const service = axios.create({baseURL: import.meta.env.VITE_APP_ENV == 'development' ? import.meta.env.VITE_APP_BASE_API : import.meta.env.VITE_APP_BASE_URL, // 设置API的基础URLtimeout: 10000,   // 设置请求超时时间
});const presentAlert = async () => {const alert = await alertController.create({header: '系统提示',message: '登录状态已过期,您可以继续留在该页面,或者重新登录',buttons: [{text: '取消',role: 'cancel',handler: () => {console.log('Alert canceled');isReloginShow = false;},},{text: '重新登录',role: 'confirm',handler: () => {console.log('Alert confirmed');isReloginShow = false;mitter.emit('token-expired');},},],});await alert.present();
};// 请求拦截器
service.interceptors.request.use(async (config: AxiosRequestConfig): Promise<any> => {// showLoading();// 是否需要设置 token    const isToken = (config.headers || {}).isToken === falseconst headers = config.headers || {};token = await storageService.getItem("token");if (token && !isToken) {headers['Authorization'] = 'Bearer ' + token; // 让每个请求携带自定义token 请根据实际情况自行修改// headers['token'] = token;config.headers = headers;}// return new Promise((resolve, reject) => {//   resolve(config)// })return config;},(error: AxiosError) => {// 处理请求错误return Promise.reject(error);}
);// 响应拦截器
service.interceptors.response.use((response: AxiosResponse) => {// 对响应数据进行处理// 未设置状态码则默认成功状态const code = response.data.code || 200;// 获取错误信息const msg = response.data.msg || showMessage(code) || showMessage('default');// 二进制数据则直接返回if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {return response.data}if (code === 401) {if (!isReloginShow) {isReloginShow = true;presentAlert();}return Promise.reject('无效的会话,或者会话已过期,请重新登录。')} else if (code === 500) {showToast(msg);return Promise.reject(new Error(msg))} else if (code !== 200) {showToast(msg);return Promise.reject('error')} else {return response.data}// return response;},(error: AxiosError) => {// 处理响应错误return Promise.reject(error);}
);export {service as request
}

src/HomePage.vue

在首页监听 token-expired 登录过期事件, 在离开页面时移出监听事件。

在这里插入图片描述

<script setup lang="ts">
import {IonPage,IonSearchbar,IonList,IonItem,IonLabel,IonSegment,IonSegmentButton,IonIcon,onIonViewWillEnter,onIonViewDidEnter,onIonViewWillLeave,modalController,IonNote,IonContent,IonHeader,
} from "@ionic/vue";
import { ref, inject } from "vue";
import * as echarts from "echarts";
import { StorageService } from "@/utils/storageService";
import { getAreaSituation, getCountrySamplePie, getNotify, getSampleInfo, getSampleInfoList } from "@/api/home";
import mitter from "@/utils/mitter";
import { useRouter } from "vue-router";
import HomeSearchDetails from "@/components/HomeSearchDetails.vue";
import { chevronForwardOutline } from "ionicons/icons";
import { QRScanner, registerKeyCodeReceiver, unregisterReceiver, UHFNotifyListeners, UHFRemoveAllListeners, addListenerRate, getEPC } from "@/utils/ratePlugin";
import { showToast } from "@/utils";const router = useRouter();
const keyWords = ref<string | undefined>("");
const areaList = ref<any[]>([]);
const selectedArea = ref<any>(null);
const inventoryStatisticsPieChart = ref<HTMLElement | null>(null);
let pieChart: echarts.ECharts;
const seriesData = ref<any[]>([]);
const messageList = ref<string[]>([]);
const searchList = ref<any[]>([]);
const storageService = inject("storageService") as StorageService;onIonViewWillEnter(async () => {const token = await storageService.getItem("token");const userInfo = await storageService.getItem("userInfo");// console.log(token, "首页token", JSON.parse(userInfo));getAreaList();getNotifyData();
});onIonViewDidEnter(() => {window.addEventListener("resize", handleResize);mitter.on("token-expired", () => {// console.log("token失效,跳转到登录页面");router.push("/login");});getChartData();
});onIonViewWillLeave(() => {window.removeEventListener("resize", handleResize);if (pieChart) {pieChart.dispose();}mitter.off("token-expired");});const handleInput = (event: Event) => {// keyWords.value = (event.target as HTMLInputElement).value;// console.log("搜索:", keyWords.value);searchList.value = [];if (keyWords.value) {getSampleInfo(keyWords.value).then((res: any) => {if (res.code === 200) {searchList.value = res.data;}})}
};const segmentChange = (event: Event) => {let val: string = (event.target as HTMLInputElement).value;selectedArea.value = areaList.value.find((item) => item.areaName == val);
};const initChart = () => {pieChart = echarts.init(inventoryStatisticsPieChart.value);let option = {title: {text: "99865",subtext: "库存总量",left: "14%",top: "center",textStyle: {fontSize: 20,},subtextStyle: {fontSize: 18,},},tooltip: {trigger: "item",},legend: {top: "center",type: "scroll",right: 0,orient: "vertical",formatter: (name: string) => {let total = 0;let target = 0;seriesData.value.forEach((item) => {total += item.value;if (item.name == name) {target = item.value;}});let percent = total ? ((target / total) * 100).toFixed(2) : 0;return `${name}  ${percent}% ${target}`;},},series: [{// name: "Access From",type: "pie",radius: ["70%", "90%"],right: "50%",avoidLabelOverlap: false,label: {show: false,position: "center",},labelLine: {show: false,},data: seriesData.value,},],};option && pieChart.setOption(option);
};const handleResize = () => {setTimeout(() => {if (pieChart) {pieChart.resize();}}, 500);
};const getAreaList = () => {getAreaSituation().then((res: any) => {if (res.code === 200) {areaList.value = res.data;selectedArea.value = areaList.value[0];}});
};const getChartData = () => {getCountrySamplePie().then((res: any) => {if (res.code === 200) {seriesData.value = res.data;initChart();}});
};const getNotifyData = () => {getNotify().then((res: any) => {if (res.code === 200) {messageList.value = res.data;}});
};</script>

参考:Vue3 mitt 组件通信 - 附完整示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rtos最小任务切换的实现 keil软件仿真 stm32 PendSV

最小任务切换的实现 本例子实现了一个 rtos 最小的任务切换功能&#xff0c;使用 keil 仿真功能&#xff0c;在模拟的 stm32f103 的器件上实现了使用 PendSV 中断切换线程的效果。 git 源码仓库&#xff1a;https://github.com/yutianos/rtos-little 本文链接&#xff1a;csdn…

数学函数,字符串

目录 Math类 三角函数 指数函数 取整方法 其他方法 String类 常见方法 字符串比较方法 子串和数字与字符串的转换 Math类 Math类在java.lang中&#xff0c;不用显式引入。 三角函数 private static void triangleFunc() {double degree Math.toDegrees(Math.PI / 3…

神经网络与深度学习——第4章 前馈神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第4章 前馈神经网络 前馈神经网络 神经元 Sigmoid型函数 Hard-Logistic函数和Hard-Tanh函数 ReLU函数 带泄露的ReLU 带参数的ReLU ELU函数 Softplus函数 Swish函数 GELU函数 Maxout单元 网络结构 前馈网络…

Qt图像处理技术九:得到QImage图像的灰度直方图

效果 原理 得到灰度化值&#xff0c;将灰度化的值带入0-255内&#xff0c;增加&#xff0c;得到可视化图形 源码 // 绘制直方图 QImage drawHistogram(const QImage &image) {QVector<int> histogram(256, 0);// 计算图像的灰度直方图for (int y 0; y < image…

【SpringBoot】SpringBoot整合JWT

目录 先说token单点登录&#xff08;SSO&#xff09;简介原理单点登录的优势单点登录流程分布式单点登录方式方式一&#xff1a;session广播机制实现方式二&#xff1a;使用cookieredis实现。方式三&#xff1a;token认证 JWT数字签名JWT的作用JWT和传统Session1、无状态&#…

linux nohup命令详解:持久运行命令,无视终端退出

nohup &#xff08;全称为 “no hang up”&#xff09;&#xff0c;用于运行一个命令&#xff0c;使其在你退出 shell 或终端会话后继续运行。 基本语法 nohup command [arg1 ...] [&> output_file] &command 是你想要运行的命令。[arg1 ...] 是该命令的参数。&am…

微服务学习Day8

文章目录 Sentinel雪崩问题服务保护框架Sentinel配置 限流规则快速入门流控模式流控效果热点参数限流 隔离和降级FeignClient整合Sentinel线程隔离&#xff08;舱壁模式&#xff09;熔断降级 授权规则及规则持久化授权规则自定义异常结果持久化 Sentinel 雪崩问题 服务保护框架…

让WSL内核使用BBR拥塞控制算法

使用git命令从Linux内核的Git仓库中获取源代码,$ git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git,找到对应的内核版本$ git log --grep="5.15.146.1-microsoft-standard-WSL2",回退到本机安装的内核版本$ git checkout <commit-id&…

无界延迟队列DelayQueue

一:介绍 DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。 二: DelayQueue基本原理 DelayQueue是一个没有边界…

代码随想录算法训练营第十天|232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 文档讲解&#xff1a;代码随想录 状态&#xff1a;写出来 &#xff0c;但差强人意 思路&#xff1a; 定义两个容器&#xff0c;可以是Stack&#xff0c;也可以是Deque&#xff0c;stackIn相当于临时容器,用来存放元素&…

git随记

git status 查看文件状态 git status -s 比较简洁的查看文件状态。如下代表此文件是新建的&#xff0c;没有被git跟踪的文件&#xff1a; $ git status -s ?? abc.txtgit add abc.txt 将abc添加到暂存区。后再次git status -s $ git status -s A abc.txtgit reset 将暂存…

嵌入式开发--stm32cubeprogrammer写入选项字节

需要在批量烧写时写入选项字节&#xff0c;操作如下&#xff1a; 在下载页面&#xff0c;勾选选项字节命令&#xff0c; 输入以下命令&#xff0c;后面的0xBB表示选项字节是bb&#xff0c;表示读保护&#xff0c;也可以按需要写其他的字符 -ob rdp0xBB在需要的功能前打上勾&a…

知识图谱抽取实战

相关代码见文末 1.知识图谱应用场景 知识图谱是一种先进的数据组织形式,它通过图数据结构来表示实体(如人、地点、概念)及其之间的复杂关系,便于机器理解和处理。这种结构化知识库允许高效的信息检索、推理和知识发现,尤其适用于处理高度关联且需要深度理解的领域,如医学…

解决wireshark无法抓取mysql数据报文

我前几天在用wireshark抓取mysql协议&#xff0c;只能看到登录信息&#xff0c;完全看不到具体报文。显示如下&#xff1a; 找了多资料&#xff0c;我也没解决这问题。但用公司测试环境的数据库就能抓取到mysql数据报文&#xff0c;观察了下公司的数据库就只发现连接url上多了…

使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展&#xff0c;允许在 Web 应用中添加实时功能&#xff0c;例如 Websockets、HTTP2 和其他协议。本…

oracle mysql索引区别

文章目录 1.引言1.1 索引的基本概念1.2 Oracle和MySQL的简介 2.Oracle索引2.1 Oracle索引的类型**B-Tree索引****Bitmap索引****Function-Based索引****Partitioned索引****Text索引** 2.2 Oracle索引的工作原理2.3 Oracle索引的实例代码 3.MySQL索引3.1 MySQL索引的类型**B-Tr…

[PyQt5] 窗口接收WM_COPY消息

#本程序是python qt5 创建的窗口&#xff0c;拦截外部消息给窗口发送的WM_COPY消息并显示出来。一般是用来作为窗口之间的通讯机制之一。 python文件如下&#xff1a;qt5拦截消息 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QAp…

STM32-14-FSMC_LCD

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU 文章目录 1. 显示器分类2. LCD简…

掌握 NestJS 10.x:从零开始构建高效可扩展的服务器端应用详解

NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架&#xff0c;基于 TypeScript 构建&#xff0c;并且受 Angular 的启发&#xff0c;提供了模块化、易测试、易维护的架构。NestJS 10.x 引入了一些新特性和改进&#xff0c;进一步提升了开发体验。本文将详细介绍如…

协方差和协方差矩阵是什么

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个矩阵&#xff0c;它包含多个随机变量之间的协方差。 协方差是衡量两个随机变量如何一起变化的度量。 协方差矩阵在多元统计分析和机器学习中非常重要&#xff0c;特别是在处理多元正态分布时。 详细解释 协方差&am…