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

仅需三分钟,使用Vue3.x版本组件式风格实现一个消息提示组件!

一、前言

在日常的前端项目开发中,我们时常需要使用到“消息提示”(以下简称“消息”)这个组件来帮助我们更好的给予用户提示,例如常见的“登录成功”、“操作成功”、“服务器异常”等等提示。
尽管市面上已经有一些组件库提供了这样的组件,例如国产的Element-Plus(如下图)。但他们还是有一个缺点,即如果我仅仅需要消息提示这一组件,那么引入一个大型的组件库是完全多余的,对整个项目来说,也会使其依赖体积过分庞大。
element-plus的消息通知框

此外,还需要考虑到用户自定义的需求。例如,我可能并不希望我的“消息”组件和别人的千篇一律,那么学习如何定制消息组件显然是很有必要的。
那么,如何使用Vue3.x版本的组件式开发风格配合TypeScript来实现这样的功能呢?以下,我将做一个简单的演示,需要注意依赖的版本问题。
我使用的依赖版本

二、分析消息组件的需求

在正式的实现一个消息组件之前,我们先要思考这个组件需要哪些功能,这部分我整理如下:

  1. 在页面顶部中心位置弹出消息通知框,并且能够设置停留在页面上的时间。
  2. 消息通知框有不同的类型,例如警告、错误、、通知、成功。
  3. 当多个消息通知框同时展示时,新出现的消息通知框应该在原有的下方展示,并且当原有的消息通知消失时,能够自动更新位置。

三、消息组件的实现

首先,创建一个Vue3.x的项目。

(一)新建一个Message组件

以下是Message组件代码的一个示例,它支持自定义消息内容,并且能根据props中传入消息类型的不同而展示不同的图标和样式,同时引入了一个名为lucide的UI库,这个库相对轻量级,因此不必担心其占用问题。
唯一需要注意的是,下方的全局样式部分。它定义了两个动画帧,同时定义了一个名为message-fade-out的类,这部分主要是用于给消息组件做入场和出场动画的。
它不能被放入组件私有样式里,因为我们的消息组件后续会作为一个Vue APP挂载到一个HTML Element上,这时由于该元素属于消息组件的父级节点,组件内部样式会对其不起作用。

<template><div class="message" :class="type"><span class="icon" v-if="showIcon"><component :is="iconComponent" /></span><span class="content">{{ content }}</span></div>
</template><script setup lang="ts">
import { computed } from 'vue';
import { Info, CheckCircle, AlertCircle, XCircle } from 'lucide-vue-next'; // 使用 lucide-vue-next 图标库interface Props {content: string;type?: 'info' | 'success' | 'warning' | 'error';showIcon?: boolean;
}const props = withDefaults(defineProps<Props>(), {type: 'info',showIcon: true,
});// 根据类型选择图标
const iconComponent = computed(() => {switch (props.type) {case 'success':return CheckCircle;case 'warning':return AlertCircle;case 'error':return XCircle;default:return Info;}
});
</script><style scoped>
/* 组件的私有样式 */
.message {position: relative;left: 50%;transform: translateX(-50%);padding: 12px 20px;border-radius: 8px;color: white;z-index: 1000;display: flex;align-items: center;gap: 10px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);opacity: 0;animation: fadeIn 0.3s ease forwards;
}.message.info {
background-color: #3498db;
}.message.success {
background-color: #2ecc71;
}.message.warning {
background-color: #f1c40f;
}.message.error {
background-color: #e74c3c;
}.icon {
display: flex;
align-items: center;
}.content {
flex: 1;
word-break: break-word;
}</style><style>
.message-fade-out {animation: fadeOut 0.3s ease forwards !important;
}@keyframes fadeIn {from { opacity: 0; transform: translateX(-50%) translateY(-20px); }to { opacity: 1; transform: translateX(-50%) translateY(0); }
}@keyframes fadeOut {from { opacity: 1; transform: translateX(-50%) translateY(0); }to { opacity: 0; transform: translateX(-50%) translateY(-20px); }
}
</style>

(二)新建一个message.ts的文件

其主要用于实现消息组件的逻辑,同时对外提供消息方法。主要实现思路如下:
1.首先定义一个消息对象和一个消息队列,消息对象由idapp对象和html元素构成。之所以这么做,是因为我们的消息组件需要作为Vue App挂载到一个具体的元素上,他们具备一一对应的关系。这样维护一个消息队列,可以更方便地计算多个消息展示时具体的高度。
2.然后编写展示消息的逻辑:
(1)对于初次使用消息组件的情况,先新建一个外层容器div,这么做可以更好的控制消息组件的样式。
(2)创建一个消息div,添加到上述容器的子节点中,接着消息组件作为APP挂载到该元素上。
(3)更新消息位置,并设置一个定时器,使其到达指定时间后触发隐藏消息的方法。
3.消息隐藏方法的逻辑较为简单,核心为给消息挂载的el元素上添加渐隐的class,使其触发动画效果,并通过侦听器,让其在动画结束后从DOM中移除。
4.更新消息高度的方法,这部分核心是动态地根据队列中消息的index来给其分配合适的高度。
5.最后,将四种类型的消息方法导出。

import { createApp } from 'vue';
import type { App } from 'vue';
import Message from '@/components/Message.vue';type MessageType = 'info' | 'success' | 'warning' | 'error';interface MessageInstance {id: number;app: App<Element>;el: HTMLElement;
}const messageQueue: MessageInstance[] = [];
let messageContainer: HTMLElement | null = null;
let messageId = 0;// 动态计算消息位置
function updateMessagePositions() {let currentTop = 20; // 初始顶部距离messageQueue.forEach((msg) => {const el = msg.el;const height = el.offsetHeight; // 获取实际高度el.style.top = `${currentTop}px`;currentTop += height + 10; // 累加高度和间隙});
}function showMessage(content: string, type: MessageType = 'info', duration: number = 3000) {if (!messageContainer) {messageContainer = document.createElement('div');messageContainer.style.position = 'fixed';messageContainer.style.top = '0';messageContainer.style.left = '0';messageContainer.style.width = '100%';messageContainer.style.pointerEvents = 'none'; // 防止拦截点击事件document.body.appendChild(messageContainer);}const id = messageId++;const el = document.createElement('div');el.style.position = 'absolute';el.style.left = '50%';el.style.transform = 'translateX(-50%)';el.style.transition = 'top 0.8s ease';//添加过渡,这样当一个消息消失时,其他消息的高度变化会有过渡效果。const messageApp = createApp(Message, { content, type });const messageInstance: MessageInstance = { id, app: messageApp, el };messageQueue.push(messageInstance);messageContainer.appendChild(el);messageApp.mount(el);// 等待 DOM 更新后计算位置updateMessagePositions()// 自动隐藏setTimeout(() => hideMessage(id), duration);
}function hideMessage(id: number) {const index = messageQueue.findIndex((msg) => msg.id === id);if (index === -1) return;const [messageInstance] = messageQueue.splice(index, 1);const el = messageInstance.el;// 添加淡出动画类el.classList.add('message-fade-out');// 动画结束后移除元素const onAnimationEnd = () => {el.removeEventListener('animationend', onAnimationEnd);messageInstance.app.unmount();el.remove();updateMessagePositions();};el.addEventListener('animationend', onAnimationEnd, { once: true });}export default {info(content: string, duration?: number) {showMessage(content, 'info', duration);},success(content: string, duration?: number) {showMessage(content, 'success', duration);},warning(content: string, duration?: number) {showMessage(content, 'warning', duration);},error(content: string, duration?: number) {showMessage(content, 'error', duration);},
};

(三)测试消息组件

我们可以任意新建一个新的组件,并通过按钮触发消息通知,例如:

const handleClick = () => {message.info('这是一个比较长的句子字字字字字……', 5000)
}

页面上展示效果如下:

四、总结

恭喜你!顺利看到这里,想必已经掌握了如何自主实现一个消息组件。在这个过程中,相信你对DOM操作的理解也进一步加深了,接下来可以任意定制想要的内容啦!

相关文章:

仅需三分钟,使用Vue3.x版本组件式风格实现一个消息提示组件!

一、前言 在日常的前端项目开发中&#xff0c;我们时常需要使用到“消息提示”&#xff08;以下简称“消息”&#xff09;这个组件来帮助我们更好的给予用户提示&#xff0c;例如常见的“登录成功”、“操作成功”、“服务器异常”等等提示。 尽管市面上已经有一些组件库提供了…...

天猫代运营公司推荐:品融电商

天猫代运营公司推荐&#xff1a;品融电商 在电商行业竞争日益激烈的今天&#xff0c;选择一家专业的天猫代运营公司成为众多品牌商家提升市场竞争力、实现销售增长的关键。在众多代运营公司中&#xff0c;品融电商凭借其专业的团队、丰富的经验和显著的成功案例&#xff0c;脱…...

2025.2.26#Java开发中的鉴权机制详解

1、Java开发中的鉴权机制详解 用户问的是在Java开发中什么是鉴权。首先&#xff0c;我需要明确鉴权的定义。鉴权&#xff0c;也就是认证授权&#xff0c;是确认用户身份和权限的过程。可能用户刚接触安全相关的内容&#xff0c;需要简单明了的解释。 接下来&#xff0c;我应该分…...

AF3 DataPipeline类解读

AlphaFold3 的DataPipeline类处理单链蛋白数据,主要负责从不同数据源(FASTA、PDB、mmCIF、ProteinNet .core 文件等)解析输入序列、MSA、模板匹配、序列嵌入(如 ESM-2)、并将其转换为 AlphaFold3 可用的特征格式。 源代码: class DataPipeline:"""Assem…...

Windows系统PyTorch环境配置

0、前言 深度学习为什么要配置GPU&#xff1f; GPU&#xff08;图形处理单元&#xff09;最初是为图形渲染而设计的&#xff0c;它们擅长处理大量并行计算任务。深度学习模型&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xf…...

策略模式环境类的实现方式对比

文章目录 1、策略模式2、聚合策略类实现方式一3、聚合策略类实现方式二4、对比5、补充&#xff1a;ApplicationContextAware接口 1、策略模式 近期工作中&#xff0c;需要处理4.x和5.x两个版本的数据&#xff0c;所以自然想到的是策略模式&#xff0c;写一个抽象类&#xff0c…...

深入理解JVM的运行时数据区

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

mapbox基础,加载background背景图层

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

14.二叉搜索树

二叉搜索树 1.概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: *若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 *若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结点…...

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种&#xff1a; 基本数据类型&#xff1a; 字符串、数值、布尔、undefined、null 引用类型: 对象 但是&#xff0c;我们会发现有些特殊情况&#xff1a; //普通字符串 const str peiqi console.log(str.length) //…...

飞鱼科技游戏策划岗内推

协助策划完成相关工作&#xff0c;包括但不仅限于策划配置&#xff0c;资料搜集&#xff0c;游戏体验&#xff1b; 游戏策划相关作品&#xff1b;游戏大赛经历&#xff1b;游戏demo制作经历&#xff1b;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU...

探索浮点数在内存中的存储(附带快速计算补码转十进制)

目录 一、浮点数在内存中的存储 1、常见的浮点数&#xff1a; 2、浮点数存储规则&#xff1a; 3、内存中无法精确存储&#xff1a; 4、移码与指数位E&#xff1a; 5、指数E的三种情况&#xff1a; 二、快速计算补码转十进制 1、第一种方法讨论&#xff1a; 2、第二种方…...

elfk+zookeeper+kafka​数据流

申请7台部署elfkzookeeperkafka 数据流&#xff1a; filebeat(每台app) ------>【logstash(2) kafka(3)】 -------> logstash(1) -------> 【elasticsearch(3) kibana(1)】...

汽车悬架系统技术演进:从被动到全主动的革新之路(主动悬架类型对比)

在汽车工业的百年发展史中&#xff0c;悬架系统始终是平衡车辆性能与舒适性的关键战场。随着消费者对驾乘体验要求的不断提升&#xff0c;传统被动悬架已难以满足中高端车型的需求&#xff0c;而半主动与全主动悬架技术的崛起&#xff0c;正在重塑行业格局。本文将深入解析三大…...

什么限制了LLM:空间复杂度限制

什么限制了LLM: 空间复杂度限制 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,它描述了算法所需的额外存储空间与输入数据规模之间的增长关系。这里的存储空间主要包括算法执行过程中所使用的变量、数据结构、栈空间等。和时间复杂度类似,空间复杂度通常也…...

Docker02 - 深入理解Docker

深入理解Docker 文章目录 深入理解Docker一&#xff1a;Docker镜像原理1&#xff1a;镜像加载原理1.1&#xff1a;unionFS1.2&#xff1a;加载原理 2&#xff1a;分层理解 二&#xff1a;容器数据卷详解1&#xff1a;什么是容器数据卷2&#xff1a;使用数据卷3&#xff1a;具名…...

深度学习中卷积层(Conv)、BN层(Batch Normalization)和 ReLU层(Rectified Linear Unit)的详细介绍

一、卷积层&#xff08;Conv&#xff09; 定义 卷积层是深度学习中卷积神经网络&#xff08;CNN&#xff09;的核心组成部分。它通过对输入数据&#xff08;如图像&#xff09;进行卷积操作来提取特征。卷积操作是用一个卷积核&#xff08;也称为滤波器&#xff09;在输入数据上…...

二分查找算法的全面解析C++

一、核心原理与特性 二分查找是一种**对数时间复杂度(O(log n))**的高效搜索算法46&#xff0c;需满足两个前提条件&#xff1a; 数据存储在连续内存空间&#xff08;如数组&#xff09;数据按升序/降序有序排列35 算法通过折半比较缩小搜索范围&#xff1a; 初始化左右边界…...

【论文笔记】Splatter Image: Ultra-Fast Single-View 3D Reconstruction

原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Szymanowicz_Splatter_Image_Ultra-Fast_Single-View_3D_Reconstruction_CVPR_2024_paper.pdf 简介&#xff1a;本文介绍了Splatter Image这一非常高效的单目3D物体重建方法。基于高斯溅射&#xf…...

【论文解读】《C-Pack: Packed Resources For General Chinese Embeddings》

论文链接&#xff1a;https://arxiv.org/pdf/2309.07597 本论文旨在构建一套通用中文文本嵌入的完整资源包——C-Pack&#xff0c;解决当前中文文本嵌入研究中数据、模型、训练策略与评测基准缺失的问题。论文主要贡献体现在以下几个方面&#xff1a; 大规模训练数据&#xf…...

Python 3 实用工具库

Python 作为一门强大且灵活的编程语言&#xff0c;提供了许多内建库和模块&#xff0c;可以大大简化开发工作&#xff0c;提升开发效率。在日常开发中&#xff0c;使用一些实用的工具库能够帮助你更轻松地完成任务。本文将介绍几款常用且实用的 Python 3 工具库&#xff0c;它们…...

vue+element-dialog:修改关闭icon / 遮罩层不能挡住弹窗 / 遮罩层不能遮挡元素

一、是否显示操作按钮 二、修改dialog默认关闭icon .el-dialog__headerbtn {top: 15px !important;width: 18px;height: 18px;background: url(~assets/img/formworkManagement/close-button.png) left no-repeat;background-size: cover; } .el-dialog__headerbtn i {content…...

深入解析React性能优化三剑客:React.memo、useMemo与useCallback

目录 渲染机制基础 React的渲染流程解析组件重渲染的根本原因性能优化的核心目标 React.memo深度解析 组件级缓存原理浅比较机制详解自定义比较函数实现 useMemo核心技术 值缓存机制剖析引用稳定性控制复杂计算场景实战 useCallback终极指南 函数缓存本质闭包陷阱解决方案事…...

Java高频面试之SE-23

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java 中的 Stream 是 Java 8 引入的一种全新的数据处理方式&#xff0c;它基于函数式编程思想&#xff0c;提供了一种高效、简洁且灵活的方式来…...

SOC-ATF 安全启动BL31流程分析(3)

一、BL31启动流程 与bl1和bl2不同&#xff0c;bl31包含两部分功能&#xff0c;在启动时作为启动流程的一部分&#xff0c;执行软硬件初始化以及启动bl32和bl33镜像。在系统启动完成后&#xff0c;将继续驻留于系统中&#xff0c;并处理来自其它异常等级的smc异常&#xff0c;以…...

计算机三级网络技术备考

#subtotal 1Mbps1024kb128KB12.8M/s #1024B1KB 1024KB1MB 1024MB1GB #路由器的5G信号和平常的波长不同&#xff08;5G的穿墙性能差&#xff09; #局域网LAN&#xff08;一公里内——构成集线机、交换机、同轴电缆&#xff09; #城域网MAN&#xff08;几公里到几十公里——光…...

Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;四&#xff09;修改远程配置文件&#xff0c;取消root禁用&#xff0c;便于使用root身份远程 前言一、远程连接的用途和原因二、通过 ssh 远程登陆系统三、默认限制及解决方案&#xff08;一&#xff09;非常规方法一&#…...

【笔记ing】每天50个英语词汇

ex- e-out exclude 排外&#xff0c;排除 expect 期待&#xff0c;期望 单词构成&#xff1a; 前缀&#xff08;prefix&#xff09;&#xff1a;情感&#xff08;emotion&#xff09;方向&#xff08;orientation&#xff09; 词根&#xff08;root&#xff09;&#xf…...

Linux 基本开发工具的使用(yum、vim、gcc、g++、gdb、make/makefile)

文章目录 Linux 软件包管理器 - yum理解什么是软件包和yum如何查看/查找软件包如何安装软件如何实现本地机器和云服务器之间的文件互传如何卸载软件 Linux 编辑器 - vim 的使用vim 的基本概念vim 的基本操作vim 命令模式各命令汇总vim 底行模式各命令汇总vim 的简单配置 Linux …...

idea创建第一个springboot程序

说明&#xff1a; 我计划用idea&#xff0c;创建第一个springboot程序&#xff0c;但是作为新手完全不会弄&#xff0c;今天我就亲自尝试一边&#xff0c;并且出一期详细&#xff0c;完美的教程&#xff0c;亲测可以运行 step1. 点击file &#xff0c; 选new&#xff0c; 选…...

python 使用 venv 创建虚拟环境 (VSCode)

Python 自带了一个名为 venv 的模块&#xff0c;可以用来创建虚拟环境。这是 Python 官方推荐的方式&#xff0c;不需要额外安装 Anaconda 或其他工具。 假设项目名为myproject&#xff0c;进入到项目目录 cd myproject 创建虚拟环境 python3 -m venv 虚拟环境名&#xff08…...

组态软件在物联网中的应用

随着物联网的快速发展&#xff0c;组态软件在物联网中的应用也越来越广泛。组态软件是一种用于创建和管理物联网系统的可视化工具&#xff0c;它能够将传感器、设备和网络连接起来&#xff0c;实现数据的采集、分析和可视化。本文将探讨组态软件在物联网中的应用&#xff0c;并…...

字节火山引擎-大模型声音复刻,流式语音合成接口

字节火山引擎-大模型声音复刻&#xff0c;流式语音合成接口 参考文档&#xff1a;火山引擎-大模型声音复刻文档 官网给出的示例代码有bug&#xff0c;这里已经修改了 创建应用 声音复刻大模型页面查看应用&#xff0c;获取接口调用需要的参数 注意调用tts接口时候需要三个参数…...

QT:Graphics View的坐标系介绍

在 Qt 的 Graphics View 框架中&#xff0c;存在三种不同的坐标系&#xff0c;分别是 物品坐标系&#xff08;Item Coordinates&#xff09;、场景坐标系&#xff08;Scene Coordinates&#xff09; 和 视图坐标系&#xff08;View Coordinates&#xff09;。这三种坐标系在图形…...

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时&#xff0c;合理的环境管理是必不可少的&#xff0c;特别是当你在多个项目中…...

Unity TMPro显示中文字体

TMP默认的字体只能显示英语&#xff0c;那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本&#xff0c;也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…...

【嵌入式原理设计】实验五:远程控制翻盖设计

目录 一、实验目的 二、实验环境 三、实验内容 四、实验记录及处理 五、实验小结 六、成果文件提取链接 一、实验目的 熟悉和掌握舵机及串口控制方式 二、实验环境 Win10ESP32实验开发板 三、实验内容 1、熟悉舵机的控制方式&#xff1b; 2、用串口发…...

矩阵乘积态简介

定义 矩阵乘积态&#xff08;Matrix Product State, MPS&#xff09;是一种用于表示量子多体系统的强大工具&#xff0c;特别是在一维系统中。MPS 是一种张量网络状态&#xff0c;它通过将全局量子态分解为一系列局部张量的乘积来有效地表示量子态。 注释&#xff1a; 量子态表…...

国自然面上项目|基于肺癌精准靶向治疗的基因影像组学研究|基金申请·25-02-26

小罗碎碎念 今天和大家分享一个国自然面上项目&#xff0c;执行年限为2019.01&#xff5e;2022.12&#xff0c;直接费用为57万元。 项目旨在解决肺癌靶向治疗耐药问题&#xff0c;通过整合多组学和影像组学技术构建预测模型。 研究期间&#xff0c;对非小细胞肺癌 CT 影像组学…...

OA办公系统自动渗透测试过程

目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境...

Fisher信息矩阵(Fisher Information Matrix,简称FIM)

Fisher信息矩阵简介 Fisher信息矩阵&#xff08;Fisher Information Matrix&#xff0c;简称FIM&#xff09;是统计学和信息理论中的一个重要概念&#xff0c;广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔&#xff08;Ronald Fisher&#xff09;的名…...

nginx反向代理以及负载均衡(常见案例)

一、nginx反向代理 1、什么是代理服务器&#xff1f; 代理服务器&#xff0c;客户机在发送请求时&#xff0c;不会直接发送给目的主机&#xff0c;而是先发送给代理服务器&#xff0c;代理服务接受客户机请求之后&#xff0c;再向主机发出&#xff0c;并接收目的主机返回的数据…...

LabVIEW形状误差测量系统

在机械制造领域&#xff0c;形状与位置公差&#xff08;GD&T&#xff09;直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点&#xff1a; ​ 设备局限&#xff1a;机械式千分表需人工读数&#xff0c;精度…...

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹&#xff0c;用于放置调试文件以及你未来写的代码&#xff0c;随便命名但…...

排序模板——C++

0.排序模板题目 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 …...

HTTP/HTTPS 服务端口监测的简易实现

一 HTTP/HTTPS 服务端口监测的简易实现方法 在当今快节奏的工作环境中&#xff0c;工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说&#xff0c;工作任务一个接一个&#xff0c;大家都在各自的岗位上争分夺秒地忙碌着。然而&#xff0c;就在这样高强度的工作…...

快速入门——状态管理VueX

Vuex介绍 状态管理 每一个Vuex应用的核心都是一个store&#xff0c;与普通的全局对象不同的是&#xff0c;基于Vue数据与视图绑定的特点&#xff0c;当store中的状态发生变化时&#xff0c;与之绑定的视图也会被重新渲染。 store中的状态不允许被直接修改&#xff0c;改变sto…...

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中&#xff0c;我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手&#xff0c;但是需要运行Py脚本&#xff0c;还比较麻烦&#xff0c;下面我们用C#依据Ollama提供的API接口开发一个本地A…...

Flutter - 基础Widget

Flutter 中万物皆 Widget&#xff0c;基础Widget 同步对应 Android View. 普通文本 Text /*** 控制文本样式统一使用 style:TextStyle, 例&#xff1a;fontSize(字体大小),color(颜色),shadows(阴影)等等* 控制文本布局需单独设置&#xff1a;* textAlign(文不对齐方式)* te…...

Tips :仿真竞争条件 指的是什么?

文章目录 **为什么会出现仿真竞争条件?****典型场景举例****System Verilog 如何解决竞争条件?****1. 使用 `program` 块隔离测试平台****2. 使用 `clocking` 块明确时序关系****3. 非阻塞赋值(`<=`)的合理使用****竞争条件的根本原因****总结****代码结构****1. 设计模…...