Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)

Vue Amazing UI
一个 Vue 3 组件库
使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking
有点意思
English | 中文
Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常用工具函数,并且持续不断维护更新中。另外,组件库全量使用 TypeScript,支持自动按需引入和 Tree Shaking 等,能够显著提升开发效率,降低开发成本。
文档
Vue Amazing UI
特性
- 组件库采用
Vue@3.5.13+TypeScript@5.7.2+Vite@6.0.7+Less@4.2.1实现 - 目前共包含
63个基础UI组件以及16个工具函数,并且持续探索更新中… - 顺便一提,它们全都可以
treeshaking Vue Amazing UI全量使用TypeScript编写,和你的TypeScript项目无缝衔接- 全部组件均采用单文件组件
SFC风格,可独立使用 - 开箱即用,不墨迹
安装
pnpm add vue-amazing-ui
# or
npm install vue-amazing-ui
# or
yarn add vue-amazing-ui
# or
bun add vue-amazing-ui
使用组件
全局完整注册(不推荐)
失去 tree-shaking 的能力,打包后有冗余代码
import { createApp } from 'vue'
import App from './App.vue'
import VueAmazingUI from 'vue-amazing-ui'
import 'vue-amazing-ui/css'const app = createApp(App)
app.use(VueAmazingUI)
app.mount('#app')
全局部分注册
这种情况下,只有导入的组件才会被打包
import { createApp } from 'vue'
import App from './App.vue'
import { Button, Tag } from 'vue-amazing-ui'
import 'vue-amazing-ui/es/button/Button.css'
import 'vue-amazing-ui/es/tag/Tag.css'const app = createApp(App)
app.use(Button).use(Tag)
app.mount('#app')
局部注册组件
这种情况下,也只有导入的组件才会被打包
<script setup lang="ts">
import { Button, Tag } from 'vue-amazing-ui'
import 'vue-amazing-ui/es/button/Button.css'
import 'vue-amazing-ui/es/tag/Tag.css'
</script>
<template><Button>button</Button><Tag>tag</Tag>
</template>
自动引入样式(推荐)
使用 vite-plugin-style-import 插件来按需自动引入组件样式,插件会自动解析模板中的使用到的组件,并导入其样式
pnpm add vite-plugin-style-import -D
# or
npm install vite-plugin-style-import -D
# or
yarn add vite-plugin-style-import -D
# or
bun add vite-plugin-style-import -D
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { createStyleImportPlugin } from 'vite-plugin-style-import'
// 自动引入组件样式
import { VueAmazingUIStyleResolve } from 'vue-amazing-ui'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),// imports component library styles on demandcreateStyleImportPlugin({resolves:[VueAmazingUIStyleResolve()]})]
})
然后,你可以在代码中引入使用 vue-amazing-ui 的所有组件,无论是全局部分注册的方式,还是局部注册的方式,都无需再额外引入组件样式
-
全局部分注册
import { createApp } from 'vue' import App from './App.vue' import { Button, Tag } from 'vue-amazing-ui'const app = createApp(App) app.use(Button).use(Tag) app.mount('#app') -
局部注册
<script setup lang="ts"> import { Button, Tag } from 'vue-amazing-ui' </script> <template><Button>button</Button><Tag>tag</Tag> </template>
自动按需引入(强烈推荐)
使用 unplugin-vue-components 插件来按需自动加载组件,插件会自动解析模板中的使用到的组件,并导入组件和样式
pnpm add unplugin-vue-components -D
# or
npm install unplugin-vue-components -D
# or
yarn add unplugin-vue-components -D
# or
bun add unplugin-vue-components -D
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'
// vue-amazing-ui 按需引入
import { VueAmazingUIResolver } from 'vue-amazing-ui'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),Components({resolvers: [// auto import components from VueAmazingUIVueAmazingUIResolver()]})]
})
然后,你可以在代码中直接使用 vue-amazing-ui 的所有组件
<template><Button>button</Button><Tag>tag</Tag>
</template>
使用类型
所有类型均可直接从 vue-amazing-ui 中引入使用,无需任何额外安装
<script setup lang="ts">
import type { ButtonProps } from 'vue-amazing-ui'
const shape = ref<ButtonProps['shape']>('default')
</script>
<template><Button :shape="shape">button</Button>
</template>
使用工具函数
<script setup lang="ts">
import {dateFormat,formatNumber,rafTimeout,cancelRaf,throttle,debounce,add,downloadFile,toggleDark,useEventListener,useMutationObserver,useScroll,useFps,useMediaQuery,useResizeObserver,useSlotsExist
} from 'vue-amazing-ui'
</script>
项目
- 获取项目代码
git clone https://github.com/themusecatcher/vue-amazing-ui.git
- 安装依赖
cd vue-amazing-uipnpm i
- 启动
pnpm dev
博客
My CSDN Blogs
组件
| 名称 | 说明 | 名称 | 说明 |
|---|---|---|---|
| Alert | 警告提示 | Avatar | 头像 |
| BackTop | 回到顶部 | Badge | 徽标 |
| Breadcrumb | 面包屑 | Button | 按钮 |
| Card | 卡片 | Carousel | 轮播图 |
| Cascader | 级联选择 | Checkbox | 复选框 |
| Collapse | 折叠面板 | Countdown | 倒计时 |
| DatePicker | 日期选择 | Descriptions | 描述列表 |
| Dialog | 对话框 | Divider | 分割线 |
| Drawer | 抽屉 | Ellipsis | 文本省略 |
| Empty | 空状态 | Flex | 弹性布局 |
| FloatButton | 浮动按钮 | GradientText | 渐变文字 |
| Grid | 栅格 | Image | 图片 |
| Input | 输入框 | InputNumber | 数字输入框 |
| InputSearch | 搜索框 | List | 列表 |
| LoadingBar | 加载条 | Message | 全局提示 |
| Modal | 模态框 | Notification | 通知提醒 |
| NumberAnimation | 数值动画 | Pagination | 分页 |
| Popconfirm | 弹出确认 | Popover | 气泡卡片 |
| Progress | 进度条 | QRCode | 二维码 |
| Radio | 单选框 | Rate | 评分 |
| Result | 结果 | Scrollbar | 滚动条 |
| Segmented | 分段控制器 | Select | 选择器 |
| Skeleton | 骨架屏 | Slider | 滑动输入条 |
| Space | 间距 | Spin | 加载中 |
| Statistic | 统计数值 | Steps | 步骤条 |
| Swiper | 触摸滑动插件 | Switch | 开关 |
| Table | 表格 | Tabs | 标签页 |
| Tag | 标签 | Textarea | 文本域 |
| TextScroll | 文字滚动 | Timeline | 时间轴 |
| Tooltip | 文字提示 | Upload | 上传 |
| Video | 播放器 | Waterfall | 瀑布流 |
| Watermark | 水印 |
工具函数
| 名称 | 说明 | 类型 |
|---|---|---|
| dateFormat | 格式化日期时间字符串函数 | (value: number | string | Date = Date.now(), format: string = ‘YYYY-MM-DD HH:mm:ss’) => string |
| formatNumber | 数字格式化函数 | (value: number | string, precision: number = 2, separator: string = ‘,’, decimal: string = ‘.’, prefix?: string, suffix?: string) => string |
| rafTimeout | 使用 requestAnimationFrame 实现的 setTimeout 或 setInterval 调用函数 | (fn: Function, delay: number = 0, interval: boolean = false) => object |
| cancelRaf | 用于取消 rafTimeout 函数 | (raf: { id: number }) => void |
| throttle | 节流函数 | (fn: Function, delay: number = 300) => any |
| debounce | 防抖函数 | (fn: Function, delay: number = 300) => any |
| add | 消除 js 加减精度问题的加法函数 | (num1: number, num2: number) => number |
| downloadFile | 下载文件并自定义文件名,未传 name 时,从文件地址中自动提取文件名称 | (url: string, fileName?: string) => void |
| toggleDark | 一键切换暗黑模式函数 | () => void |
| useEventListener | 使用 Vue 的生命周期钩子添加和移除事件监听器 | (target: HTMLElement | Window | Document, event: string, callback: Function) => void |
| useMutationObserver | 使用 MutationObserver 观察 DOM 元素的变化 | (target: Ref | Ref[] | HTMLElement | HTMLElement[], callback: MutationCallback, options = {}) => object |
| useScroll | 实时监测目标元素滚动位置及状态 | (target: Ref | HTMLElement | Window | Document = window, throttleDelay: number = 0, onScroll?: (e: Event) => void, onStop?: (e: Event) => void) => object |
| useFps | 实时监测浏览器刷新率FPS | () => object |
| useMediaQuery | 使用媒体查询来判断当前环境是否符合指定的媒体查询条件 | (mediaQuery: string) => object |
| useResizeObserver | 使用 ResizeObserver 观察 DOM 元素尺寸变化 | (target: Ref | Ref[] | HTMLElement | HTMLElement[], callback: ResizeObserverCallback, options = {}) => object |
| useSlotsExist | 监听给定名称或名称数组的插槽是否存在,支持监听单个插槽或一组插槽的存在 | (slotsName: string | string[] = ‘default’) => Reactive | Ref<boolean> |
相关文章:
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…...
计算机Steam报错failedtoloadsteamui.dll怎么解决?DLL报错要怎么修复?
计算机Steam报错“Failed to Load SteamUI.dll”?这里有专业的解决方案! 作为软件开发领域的一名从业者,我深知电脑在运行过程中可能会遇到的各种问题,尤其是像Steam这样的大型游戏平台。今天,我将为大家科普一下Stea…...
如何开发一个简单的 dApp
后端合约 执行 sui move new resource_manage 创建一个包 接着就可以开始编写合约了 首先创建两个 Struct 用来创建 Profile 并记录在 State 中 public struct State has key {id: UID,users: Table<address, address>, }public struct Profile has key {id: UID,nam…...
TDengine 签约智园数字,助力化工园区智联未来
近年来,随着化工行业对安全、环保、高效运营的要求日益提高,化工园区的数字化转型成为必然趋势。从数据孤岛到全面互联,从基础监控到智能分析,如何高效管理和利用时序数据已成为化工园区智能化升级的关键环节。作为一家专注于时序…...
《Python游戏编程入门》注-第9章8
2 游戏信息的显示 在游戏窗口的上部会显示游戏分数、游戏关卡、剩余砖块数以及剩余小球数等信息,如图12所示。 图12 游戏信息显示 使用如图13所示的代码实现以上功能。 图13 显示游戏信息的代码 其中,print_text()函数MyLibrary....
js逆向实战(1)-- 某☁️音乐下载
下载某云音乐源文件.mp4格式 首先随便点进一首歌,如图所示获取该音乐id,然后点击播放键,打开F12进行查询XHR 由此可知,实际请求网址是 https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token「你的token」url需带…...
AIA - APLIC之三(附APLIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…...
React Router 向路由组件传state参数浏览器回退历史页面显示效果问题
昨天在看尚硅谷张天禹老师讲的 React教程p90,老师讲到 React路由的 replace模式和push模式,老师的演示效果与自己本地操作不太一样。 老师的效果:点击查看消息1,消息2,消息3 再点回退,可以依次查看到 消息…...
线程池与并发工具:Java的分身管理器
1 线程池的概念 线程池是一种执行器(Executor),用于在一个后台线程中执行任务。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提…...
字玩FontPlayer开发笔记8 Tauri2文件系统
字玩FontPlayer开发笔记8 Tauri2文件系统 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer 笔记 字玩目…...
头歌python实验:网络安全应用实践3-验证码识别
第1关:简单的验证码识别 本关任务:编写一个能简单识别验证码的小程序。 为了完成本关任务,你需要掌握: 使用 pytesseract 库与 PIL 库解析图片;环境配置;读取图片文本信息。使用 pytesseract 库与 PIL 库解析图片 pytesseract 库可以从图像中提取文本。Tesseract 是一…...
客户案例:基于慧集通(DataLinkX)集成平台的金蝶云星空与HIS系统集成案例--凭证模板的配置(一)
当前的原型客户是一家医院,财务系统使用的是金蝶云星空,需要与医院专用的HIS系统进行集成。本文档主要是介绍其中的凭证模板的配置功能。 凭证模板组件旨在生成凭证前,通过内部整理整合原始单据数据,将其转化为可生成一张凭证的数…...
基于 Python 的大学教室资源管理系统的设计与实现
标题:基于 Python 的大学教室资源管理系统的设计与实现 内容:1.摘要 摘要:随着高校教育的不断发展,教室资源的管理变得越来越重要。为了提高教室资源的利用率,本文设计并实现了一个基于 Python 的大学教室资源管理系统。该系统采用了 B/S 架…...
nginx-灰度发布策略(split_clients)
一. 简述: 基于客户端的灰度发布(也称为蓝绿部署或金丝雀发布)是一种逐步将新版本的服务或应用暴露给部分用户,以确保在出现问题时可以快速回滚并最小化影响的技术。对于 Nginx,可以通过配置和使用不同的模块来实现基于…...
nginx正向代理从安装到使用一网打尽系列(二)使用
一、背景 使用场景大总结,可作为参考手册用 nginx正向代理从安装到使用一网打尽系列(一)安装 nginx正向代理从安装到使用一网打尽系列(二)使用 二、使用场景 1、所有内网应用都不能直接访问外网,但需要…...
Bash Shell的操作环境
目录 1、路径与指令搜寻顺序 2、bash的进站(开机)与欢迎信息:/etc/issue,/etc/motd (1)/etc/issue (2)/etc/motd 3、bash的环境配置文件 (1)login与non-…...
Python爬虫基础——认识网页结构(各种标签的使用)
1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px,边框的格式也相同,只是区块中显示的内容不同; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…...
如何实现一个充满科技感的官网(二)
背景 在上一篇文章 《如何实现一个充满科技感的官网(一)》 中,我们初步了解了该官网的整体设计,并与大家探讨了它的视觉呈现和用户体验。 我们前期的内部设计偏向简洁,所以开始思考如何提升网站的整体设计感。这些尝…...
GNU链接器简介
GNU链接器简介 1 使用简单程序简介链接脚本1.1 测试程序1.2 编译测试程序1.2.1 不使用链接器编译1.2.1.1 不使用链接器编译1.2.1.2 读取objdump_test 的结构 1.2.2 使用链接器去链接1.2.2.1 链接脚本1.2.2.2 使用链接脚本编译1.2.2.3 读取objdump 的结构 2 链接脚本2.1 基本连接…...
欧几里得算法(简单理解版,非严格证明)
欧几里得算法用于求解两个整数的最大公约数,又称为辗转相除 依据的基本定理: GCD(a,b)GCD(a%b,b) 证明: 对于搞理论的人可能需要会严格证明,但是对于我们一般人而言,只要能理解其原理并记住即可,后者实际上…...
ARM64缓存一致性实战:手把手教你理解PoC和PoU,搞定DMA与JIT编译器的坑
ARM64缓存一致性实战:深入理解PoC与PoU的工程实践 在底层系统开发领域,缓存一致性始终是工程师们面临的核心挑战之一。特别是在ARM64架构下,PoC(Point of Coherency)和PoU(Point of Unification)…...
【实战指南】Gradio:从零构建可交互的机器学习演示平台
1. 为什么你需要Gradio? 如果你做过机器学习项目,肯定遇到过这样的尴尬:辛辛苦苦训练好的模型,只能躺在Jupyter Notebook里吃灰。想给同事演示效果?要么得让他们装Python环境,要么就得把代码打包成晦涩的AP…...
Endnote样式深度定制:从GBT-7142005基础版到完美适配你学校论文格式的完整指南
Endnote样式深度定制:从GBT-7142005基础版到完美适配学校论文格式的完整指南 当你熬夜赶完论文最后一章,满心欢喜地用Endnote插入参考文献,却发现生成的格式与学校要求相差甚远——中文文献的标点仍是半角,作者列表的"et al&…...
biliTickerBuy:高效智能的B站会员购票辅助工具解决方案
biliTickerBuy:高效智能的B站会员购票辅助工具解决方案 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在热门动漫展、演唱会门票一票难求的今天,biliTickerBuy为二次元…...
DVWA1.9 High级文件上传漏洞实战:3种绕过技巧与详细复现步骤
DVWA1.9 High级文件上传漏洞实战:3种绕过技巧与详细复现步骤 在网络安全领域,文件上传漏洞一直是渗透测试中的重点研究对象。DVWA(Damn Vulnerable Web Application)作为一款专为安全测试设计的靶场环境,其High级别的文…...
Lombok注解处理报错?手把手教你解决‘Enable annotation processing‘问题(附IDEA/Eclipse配置)
Lombok注解处理报错?手把手教你解决Enable annotation processing问题 最近在Java项目中使用Lombok时,你是否遇到过这样的报错信息:"Lombok requires enabled annotation processing"?这可能是新手接触Lombok时最常见的…...
告别CANoe黑盒:用Python的can库+cantools手把手解析BLF日志(附完整代码)
开源CAN数据分析实战:Python替代方案解析BLF日志全流程 在汽车电子和工业控制领域,CAN总线数据的采集与分析是开发调试的关键环节。Vector公司的CANoe长期以来是行业标准工具,但其商业授权费用让许多个人开发者和初创团队望而却步。幸运的是&…...
如何在5分钟内实现抖音批量下载?douyin-downloader开源工具完整指南
如何在5分钟内实现抖音批量下载?douyin-downloader开源工具完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…...
微信小程序ECharts图表Canvas层级覆盖问题:从原理到实战解决方案
1. 微信小程序ECharts图表Canvas层级问题解析 第一次在小程序里用ECharts做数据可视化时,我就被这个坑绊倒了——明明设置了z-index,为什么滚动页面时图表还是会盖住弹窗和导航栏?后来才发现,这是微信小程序原生组件的"特权&…...
VSCode高效配置MQL开发环境:从插件安装到实战编译
1. 为什么选择VSCode进行MQL开发 第一次用MT4/MT5自带的编辑器写MQL代码时,我差点以为回到了20年前——没有智能补全、没有代码导航、调试功能形同虚设。特别是当项目文件超过10个时,在密密麻麻的标签页里找文件就像在玩"大家来找茬"。这也是为…...
