当前位置: 首页 > news >正文

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯

组件通讯是vue3组合式开发的核心之一,现在我在写代码时,一个组件的代码超过了200行,基本都会拆分组件。组件拆分后,组件之间的通讯就很重要,总结了一下,目前有这么几种组件通讯类型:

  • 父子通讯,这是最常见的通讯方式,父传子子传父,就是父组件向子组件传值,直接使用自定义属性就可以了,父组件中定义属性,子组件中使用defineProps接受父组件传递过来的值,不过需要注意传值响应式的问题;子传父采用自定义事件,在子组件中,使用defineEmits自定义事件,并在执行某个操作时,把这个自定义事件发射出去,同时把想传递的值带上,父组件中使用@自定义事件接收值,并进行相应的操作。父子通讯与vue2并无太大的差异,只是写法不一样而已,个人的博客之前也有记录,参考vue组件之间的数据共享
  • 祖孙组件通讯,使用provide/reject实现,参考vue3使用provide&inject实现祖孙组件通讯,这是一种更复杂的组件传值的方式,比较好用,但是它只适用于上级组件向下级组件传值,不能反过来,我在写vue3时,极少用到
  • 兄弟组件通讯。这是日常开发最常遇到的,尤其是vue3中,一个父组件,然后多个子组件,子组件与子组件之间要通讯,实现起来有很多种方式,我最喜欢用的是pinia/vuex,在vue3中pinia的写法更加简约好用,所以vue3中我几乎放弃了vuex。但是有个问题,pinia作为全局数据共享工具,如果仅实现两个兄弟组件之间的通讯,那么用起来总感觉比较浪费资源。后来学习到了一种更好操作的写法,就是使用mitt第三方插件。在vue2中,mitt是官方的工具,其实就是bus事件总线,vue3移除了,尚不知道是什么原因。这篇博客主要介绍一下怎么使用mitt实现兄弟组件传值

一、安装及封装导出

安装。作为第三方插件,先安装再使用

npm i mitt -D

导出

新建个文件mitt.js,填入以下代码,即封装了一个mitt方法

// 第一种是创建一个工具js,不如说mitt.js,哪个组件要用到就引入该文件就好了。
import mitt from 'mitt'
const emitter = mitt()
export default emitter

二、组件A发射指令

组件中引入mitt,并通过事件发射指令

import mitt from '@/utils/mitt'
const emitter = mitt
const mittName = ['showOverall', 'showDriverAge', 'showAge', 'showOffences', 'showHelmetBelt', 'showOccRequire', 'showCumulativeScore']const btns = ref([{ title: '总体情况', type: 'warning' },{ title: '驾龄', type: 'success' },{ title: '年龄', type: 'success' },{ title: '违法', type: 'success' },{ title: '一盔一带', type: 'success' },{ title: '从业资格', type: 'success' },{ title: '累计计分', type: 'success' },
])
const chooseTag = i => {btns.value.forEach(item => item.type = 'success')btns.value[i].type = btns.value[i].type === 'warning' ? 'success' : 'warning'emitter.emit(mittName[i])
}

上面的代码挺复杂,业务逻辑是我点击某个按钮,就显示对应的页面,按钮组如下:

image-20230818151559855

每次点击一个按钮,就修改这个按钮的类型,同时发射这个按钮对应的指令名

三、组件B接收指令

组件B作为组件A的兄弟(广义的兄弟,五湖四海皆兄弟的意思)组件,当A发出指令后,它的其他兄弟都可以接收这个指令

<template><Overall v-if="showOverall"></Overall><DriverAge v-if="showDriverAge"></DriverAge><Age v-if="showAge"></Age><Offences v-if="showOffences"></Offences><HelmetBelt v-if="showHelmetBelt"></HelmetBelt><OccRequire v-if="showOccRequire"></OccRequire><CumulativeScore v-if="showCumulativeScore"></CumulativeScore>
</template><script setup>
import { ref } from 'vue'
import Overall from './tags/Overall.vue'
import DriverAge from './tags/DriverAge.vue';
import Age from './tags/Age.vue'
import Offences from './tags/Offences.vue'
import HelmetBelt from './tags/HelmetBelt.vue'
import OccRequire from './tags/OccRequire.vue'
import CumulativeScore from './tags/CumulativeScore.vue'import mitt from '@/utils/mitt'
const emitter = mittconst showOverall = ref(true)
const showDriverAge = ref(false)
const showAge = ref(false)
const showOffences = ref(false)
const showHelmetBelt = ref(false)
const showOccRequire = ref(false)
const showCumulativeScore = ref(false)const events = [{ emitterName: 'showOverall', showState: showOverall },{ emitterName: 'showDriverAge', showState: showDriverAge },{ emitterName: 'showAge', showState: showAge },{ emitterName: 'showOffences', showState: showOffences },{ emitterName: 'showHelmetBelt', showState: showHelmetBelt },{ emitterName: 'showOccRequire', showState: showOccRequire },{ emitterName: 'showCumulativeScore', showState: showCumulativeScore },]events.forEach(item => {emitter.on(item.emitterName, () => {// ChatGPT提供的代码,牛逼events.forEach(i => {i.showState.value = (i === item);});})
})</script><style lang="scss" scoped>
.el-header {// background-color: #333;box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;display: flex;
}
</style>

同样,上面接收指令的代码也挺复杂的,还借助了chatAI的力量才实现的

解释一下吧,就是我在一个页面上写了很多个不同的组件,通过v-if来控制是否显示这个组件,而v-if则是通过组件A的按钮点击事件来确定的

const events = [{ emitterName: 'showOverall', showState: showOverall },{ emitterName: 'showDriverAge', showState: showDriverAge },{ emitterName: 'showAge', showState: showAge },{ emitterName: 'showOffences', showState: showOffences },{ emitterName: 'showHelmetBelt', showState: showHelmetBelt },{ emitterName: 'showOccRequire', showState: showOccRequire },{ emitterName: 'showCumulativeScore', showState: showCumulativeScore },
]

events是定义的一个事件数组,emitterName是组件A发过来的事件名,showState则是显示状态

events.forEach(item => {emitter.on(item.emitterName, () => {// ChatGPT提供的代码,牛逼events.forEach(i => {i.showState.value = (i === item);});})
})

遍历训练events数组,监听里面的每个指令,当监听到了之后,就把它的showState置为true,只是多了个环节,判断当前的指令和当前点击的按钮是否相同,巧妙的实现了页面的点击响应,主要是能省不少代码。。。

俗事太多,很长一段时间没写代码,甚是怀恋,也不知道自己还能坚持几年🤡

相关文章:

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一&#xff0c;现在我在写代码时&#xff0c;一个组件的代码超过了200行&#xff0c;基本都会拆分组件。组件拆分后&#xff0c;组件之间的通讯就很重要&#xff0c;总结了一下&#xff0c;目前有这…...

(五)、深度学习框架源码编译

1、源码构建与预构建&#xff1a; 源码构建&#xff1a; 源码构建是通过获取软件的源代码&#xff0c;然后在本地编译生成可执行程序或库文件的过程。这种方法允许根据特定需求进行配置和优化&#xff0c;但可能需要较长的时间和较大的资源来编译源代码。 预构建&#xff1a; 预…...

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN

日前&#xff0c;清华大学电子工程系与火山语音团队携手合作&#xff0c;推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型&#xff0c;SALMONN对…...

NOIP 2015 扫雷(mine)

扫雷&#xff08;mine&#xff09; 说明 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#xff0c;该格将会…...

elaticsearch(3)

整合springboot 1.整合依赖 注意依赖版本和安装的版本一致 <properties> <java.version>1.8</java.version> <!-- 统一版本 --> <elasticsearch.version>7.6.1</elasticsearch.version> </properties> 导入elastics…...

DevOps系列文章 之 Gitlab+Docker自动部署SpringBoot

1.环境要求 以下服务器的操作系统均为Centos7 服务器A&#xff1a;Gitlab服务器B&#xff1a;GitlabRunner、Docker、docker-compose、Java1.8、maven3.6.3、git ps&#xff1a;这里可以把服务器B的GitlabRunner、Java1.8、maven3.6.3、git单独提出来&#xff0c;独立部署&a…...

React Native 列表组件基础知识

ScrollView 组件 ScrollView组件是一个容器滚动组件&#xff0c;当容器超出指定宽高时就可以进行滚动交互。 ScrollView组件是一次性渲染所有的 React 子组件&#xff0c;这在性能上是比较差的&#xff0c;所以不建议当列表特别长的时候使用此组件。 接下来列举几个常用的一…...

操作系统的体系结构、内核、虚拟机

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统结构 一、操作系统体系结构1.1操作系统的内核1.1.…...

【C++】vector的基本用法

vector是动态数组的同义词 一、vector对象带参数构造 1.vector<int>a(a,a5);//左闭右开 2.vector<int>b&#xff08;n&#xff0c;z&#xff09;&#xff1b;n个z 3.vector<int>c(a);//拷贝 二、动态数组可以整体赋值 vector<int>vec; vector&l…...

SSM——用户、角色、权限操作

1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…...

UI界面设置

文章目录 1. 修改 share.html 内容如下&#xff1a;2. 修改 html 文件格式为 utf-83.保存&#xff0c;运行程序4. 访问页面 1. 修改 share.html 内容如下&#xff1a; <!DOCTYPE html><html> <head><meta charset"utf-8"><title>1v1屏…...

论文学习——PixelSNAIL:An Improved Autoregressive Geenrative Model

文章目录 引言论文翻译Abstract问题 Introduction第一部分问题 第二部分问题 Model Architecture网络结构第一部分问题第二部分问题 Experiments实验问题 Conclusion结论问题 总结参考 引言 这篇文章&#xff0c;是《PixelSNAIL:An Improved Autoregressive Geenrative Model》…...

mySQL 视图 VIEW

简化版的创建视图 create view 视图名 as select col ...coln from 表create view 视图名&#xff08;依次别名&#xff09; as select col ...coln from 表create view 视图名 as select col “别名1”&#xff0c;。。。col "别名n" from 表show tab…...

「UG/NX」Block UI 曲线收集器CurveCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...

微信小程序:函数节流与函数防抖

目录 问题引入&#xff1a; 定义 解决方案&#xff1a;函数节流 一、案例举例 1.页面展示 2.search.wxml标签展示 3.search.js展示 4.结果展示 二、函数节流解决问题 1.函数 2.实例应用 三、函数防抖解决问题 1.函数 2.原理 3.应用场景 4.应用实例 总结 问题引入…...

Mathematica(42)-计算N个数值的和

比如&#xff0c;我们要用Mathematica求得到下面的式子&#xff1a; 这就需要用到一个函数&#xff1a;Sum 具体地&#xff0c;Sum函数的使用形式如下&#xff1a; 因此&#xff0c;按照公式就可以得到下面的结果&#xff1a; 如果&#xff0c;我们想要将求和号也加进去&#…...

安装和配置 Ansible

安装和配置 Ansible 按照下方所述&#xff0c;在控制节点 control.area12.example.com 上安装和配置 Ansible&#xff1a; 安装所需的软件包 创建名为 /home/curtis/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; node1 是 dev 主机组的成员 node2 …...

电脑系统重装日记

重装原因 电脑C盘几乎爆炸故重装系统一清二白 此片原因 记录重装过程&#xff0c;强调一些要注意的点&#xff0c;以防日后重装。 重装过程 1.清空电脑文件后重启&#xff0c;电脑冒蓝光&#xff0c;一直蓝屏反复重启&#xff0c;故只能重装系统以解难题。 2.准备一个U盘&…...

通讯协议044——全网独有的OPC HDA知识一之聚合(十二)持续坏值时间

本文简单介绍OPC HDA规范的基本概念&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化&#xff0c;以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…...

Docker:Windows container和Linux container

点击"Switch to Windows containers"菜单时&#xff1a; 提示 然后 实际上是运行&#xff1a;com.docker.admin.exe start-service...

ESP8266轻量级按钮状态MQTT同步库

1. 项目概述BartOS-button-online是为 BartOS 物联网操作系统设计的轻量级按钮状态在线同步库&#xff0c;专用于资源受限的 ESP8266 平台&#xff08;如 ESP-01、NodeMCU&#xff09;&#xff0c;并兼容 Arduino Core for ESP8266 开发环境。该库不提供独立的 UI 或 Web 服务&…...

M2LOrder模型LSTM原理浅析与实战:时序情感分析入门

M2LOrder模型LSTM原理浅析与实战&#xff1a;时序情感分析入门 你是不是经常看到一些智能客服或者社交平台&#xff0c;能分析出一段对话里用户情绪的变化&#xff1f;比如&#xff0c;用户一开始有点生气&#xff0c;聊着聊着又缓和了&#xff0c;最后还挺满意。这种对“情绪…...

嵌入式设备参数存储方案设计与优化

嵌入式设备参数存储方案设计与实现1. 项目概述在嵌入式系统开发中&#xff0c;参数存储是一个基础但至关重要的功能模块。合理的参数存储方案直接影响产品的可靠性、可维护性和升级扩展能力。本文将深入分析嵌入式设备中常见的参数存储方案&#xff0c;重点解决结构体存储方式存…...

写作压力小了!盘点2026年倾心之选的的降AIGC平台

轻松降低论文AI率在2026年已不再是天方夜谭。以下是2026年最炸裂、实测效果显著的降AIGC平台神器&#xff0c;覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景&#xff0c;帮你稳妥搞定毕业论文。 一、全流程王者&#xff1a;一站式搞定论文全链路 这类工具…...

深度解析GARbro:如何高效破解200+视觉小说资源格式的技术奥秘

深度解析GARbro&#xff1a;如何高效破解200视觉小说资源格式的技术奥秘 【免费下载链接】GARbro Visual Novels resource browser 项目地址: https://gitcode.com/gh_mirrors/gar/GARbro GARbro是一款面向视觉小说爱好者和游戏资源研究者的专业工具&#xff0c;基于.NE…...

STM32G473 IAP实战:基于CAN/USART双通道的BootLoader设计与固件升级全流程解析

1. 为什么需要双通道IAP方案 在工业现场设备维护中&#xff0c;固件升级是个高频刚需。想象一下车间里有上百台设备需要更新程序&#xff0c;如果每台都要拆机接下载器&#xff0c;工程师怕是会当场崩溃。我去年参与的一个AGV调度项目就吃过这个亏&#xff0c;后来我们给STM32…...

Windows 11 零基础搞定 Coze Studio 本地部署:Docker 配置 + 豆包模型实战

Windows 11 零基础搞定 Coze Studio 本地部署&#xff1a;Docker 配置 豆包模型实战 1. 环境准备与Docker安装 对于Windows 11用户来说&#xff0c;Docker是运行Coze Studio的基础环境。与Linux或macOS不同&#xff0c;Windows平台需要特别注意虚拟化支持和镜像源配置。 硬…...

探索时序并行门控网络TPGN:RNN的崭新继任者

一种RNN的新继任者—时序并行门控网络TPGN&#xff0c;用于时间序列预测。 作为RNN的新继任者。 PGN通过设计的历史信息提取&#xff08;HIE&#xff09;层直接从以前的时间步捕获信息&#xff0c;并利用门通机制选择并将其与当前时间步信息融合。 这将信息传播路径减少到0(1)&…...

抖音直播智能采集与实时分析实战指南:从数据捕获到商业决策

抖音直播智能采集与实时分析实战指南&#xff1a;从数据捕获到商业决策 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2024最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 在数字营销与内…...

为什么你的USB摄像头总掉帧?深入UVC协议Alternate Setting配置避坑指南

为什么你的USB摄像头总掉帧&#xff1f;深入UVC协议Alternate Setting配置避坑指南 工业视觉检测线上&#xff0c;一台标称30fps的USB摄像头突然掉到15帧&#xff0c;导致传送带上的缺陷品漏检&#xff1b;手术内窥镜画面在关键时刻出现卡顿&#xff0c;医生不得不暂停操作——…...