# menu-icon
**Repository Path**: gaojin-vip/menu-icon
## Basic Information
- **Project Name**: menu-icon
- **Description**: 一个基于 Vue 3 的菜单图标选择器组件库,支持 Ant Design 和 Element Plus 图标
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-09-28
- **Last Updated**: 2025-12-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# jin-menu-icon
一个基于 Vue 3 的菜单图标选择器组件库,支持 Ant Design 和 Element Plus 图标(仅图标,不依赖 Element Plus 组件库)。
> **🔄 最新更新**:v1.0.5 优化了图标显示效果,修复了样式冲突问题,统一了图标默认大小为 16px,提升了整体用户体验。已发布到 npm,可直接安装使用。
## ✨ 特性
- 🎨 **双图标库支持** - 同时支持 Ant Design 和 Element Plus 图标(仅图标库,不依赖组件)
- 🔍 **智能搜索** - 支持图标名称搜索,带防抖优化
- 📱 **响应式设计** - 适配各种屏幕尺寸
- 🎯 **TypeScript 支持** - 完整的类型定义
- 🚀 **按需引入** - 支持全局和按需引入
- 🌙 **暗色主题** - 自动适配系统主题
- ⚡ **性能优化** - 图标缓存、懒加载、防抖搜索
- ♿ **无障碍支持** - 完整的键盘导航和 ARIA 属性
- 🎛️ **高度可定制** - 丰富的配置选项
- 📦 **轻量级** - 仅依赖图标库,不依赖 UI 组件库
## 📦 安装
### 从 npm 安装
```bash
# 使用 npm
npm install jin-menu-icon
# 使用 yarn
yarn add jin-menu-icon
# 使用 pnpm
pnpm add jin-menu-icon
```
### 从源码安装
如果您需要最新功能或自定义修改,也可以从源码安装:
```bash
# 克隆项目
git clone https://gitee.com/gaojin-vip/menu-icon.git
# 进入项目目录
cd menu-icon
# 安装依赖
npm install
# 构建组件库
npm run build:lib
```
> **🎉 零配置安装**:所有图标库已内置,无需单独安装任何依赖!不依赖 Element Plus 组件库。
## 🚀 快速开始
### 全局引入
```typescript
import { createApp } from 'vue';
import MenuIconComponents from 'jin-menu-icon';
const app = createApp(App);
// 一键注册所有组件和依赖(样式会自动注入)
app.use(MenuIconComponents);
```
> **✨ 自动配置**:组件会自动注册所有图标,样式也会自动注入,您无需手动安装或注册任何依赖!
### 按需引入
```vue
```
**按需引入时的依赖注册(在 main.ts 中):**
```typescript
// main.ts
import { createApp } from 'vue';
import App from './App.vue';
import MenuIconComponents from 'jin-menu-icon';
const app = createApp(App);
// 注册菜单图标组件(自动处理所有图标和样式)
app.use(MenuIconComponents);
app.mount('#app');
```
> **💡 提示**:样式会自动注入,无需手动引入。如果需要手动控制样式,也可以从组件库中导入样式路径:
>
> ```typescript
> import { stylePath } from 'jin-menu-icon';
> // 然后动态引入样式
> ```
## 🎯 高级用法
### 自定义配置
```vue
```
### 直接复制源码使用
如果您不想通过 npm 安装,也可以直接复制`src`目录到您的项目中:
```bash
# 复制src目录到您的项目中
cp -r node_modules/jin-menu-icon/src ./src/components/menu-icon
```
然后在您的项目中引入:
```typescript
// main.ts
import { createApp } from 'vue';
import MenuIconComponents from './src/components/menu-icon/main';
const app = createApp(App);
app.use(MenuIconComponents);
```
## 📚 API 文档
### MenuIcon Props
| 参数 | 说明 | 类型 | 默认值 |
| ---------------- | -------------------- | ------------------------------- | -------------------------------- |
| modelValue | 双向绑定值 | string | - |
| prepend | 输入框前置内容 | string | 'ele-Pointer' |
| placeholder | 输入框占位文本 | string | '请输入内容搜索图标或者选择图标' |
| size | 输入框大小 | 'small' \| 'default' \| 'large' | 'default' |
| disabled | 是否禁用 | boolean | false |
| clearable | 是否可清空 | boolean | true |
| emptyDescription | 自定义空状态描述文字 | string | '无相关图标' |
| showSearch | 是否显示搜索框 | boolean | true |
| showTabs | 是否显示标签页 | boolean | true |
| maxHeight | 弹窗最大高度 | number | 230 |
| searchDebounce | 搜索防抖延迟(ms) | number | 300 |
### MenuIcon Events
| 事件名 | 说明 | 参数 |
| ----------------- | --------------- | --------------- |
| update:modelValue | 更新 modelValue | (value: string) |
| get | 获取图标 | (value: string) |
| clear | 清空图标 | (value: string) |
### SvgIcon Props
| 参数 | 说明 | 类型 | 默认值 |
| ----------- | ------------ | ------- | ------ |
| name | 图标名称 | string | '' |
| size | 图标大小 | number | 16 |
| color | 图标颜色 | string | '' |
| disabled | 是否禁用 | boolean | false |
| customClass | 自定义类名 | string | '' |
| loading | 是否显示加载 | boolean | false |
## 🏷️ 图标命名规则
- **Element Plus 图标**:`ele-{图标名}`,如 `ele-Pointer`、`ele-Edit`(仅图标,不依赖 Element Plus 组件库)
- **Ant Design 图标**:`ali-{图标名}`,如 `ali-User`、`ali-Setting`
## 🛠️ 开发
```bash
# 安装依赖
npm install
# 开发模式
npm run dev
# 构建组件库
npm run build:lib
# 类型检查
npm run type-check
# 预览构建结果
npm run preview
# 发布到 npm
npm publish
```
## 📊 包信息
- **版本**: 1.0.5
- **包大小**: 约 2.0 MB(完全自包含)
- **外部依赖**: 仅需 Vue 3.3.0+
- **内部依赖**: 仅图标库已打包,不依赖 UI 组件库
- **兼容性**: 支持现代浏览器和 Node.js 16+
- **TypeScript**: 完整类型支持
- **代码质量**: 已通过 TypeScript 检查
- **NPM 地址**: https://www.npmjs.com/package/jin-menu-icon
## 📝 更新日志
### v1.0.5 (2024-12-19)
#### ✨ 新特性
- 统一图标默认大小为 16px,提供更一致的用户体验
- 优化了图标选择器中的图标显示效果
#### 🐛 修复
- 修复了 Element Plus 图标不显示的问题(通过区分 Element Plus 和 Ant Design 图标的样式处理)
- 修复了样式冲突问题(将 `el-icon` 类名改为 `menu-icon-svg`,避免与 Element Plus 内置样式冲突)
- 修复了 Ant Design 图标在修复 Element Plus 图标后变大的问题
#### 🔧 改进
- 改进了图标样式处理逻辑,Element Plus 图标使用 `width/height`,Ant Design 图标使用 `font-size`
- 优化了 SCSS 样式,确保图标在不同模式下都能正确显示
- 增强了错误处理机制,添加了图片加载失败的处理
#### 📦 技术改进
- 更新了组件类名,避免与外部库的样式冲突
- 优化了样式计算逻辑,提升渲染性能
- 改进了移动端响应式设计
## 📁 项目结构
```
src/
├── components/ # 组件文件
│ ├── icon.vue # 主图标选择器组件
│ ├── list.vue # 图标列表组件
│ └── svgIcon.vue # SVG图标显示组件
├── types/ # TypeScript类型定义
│ └── index.ts # 类型定义文件
├── utils/ # 工具函数
│ └── init.ts # 图标初始化和注册
├── theme/ # 样式文件
│ └── iconSelector.scss # 组件样式
├── main.ts # 主入口文件
└── vue-shim.d.ts # Vue类型声明
dist/ # 构建输出目录
├── index.mjs # 主入口文件
├── assets/ # 静态资源
│ └── css/ # 样式文件
│ └── index.[hash].css # 组件样式
├── components/ # 组件文件
│ ├── index.[hash].mjs # 主组件
│ ├── list.[hash].mjs # 列表组件
│ └── svgIcon.[hash].mjs # SVG图标组件
└── types/ # TypeScript类型定义
└── main.d.ts # 主入口类型
```
## 🔧 技术特性
- **构建工具**: Vite 6.0.0
- **模块格式**: ES Module
- **外部依赖**: 仅 Vue 3.3.0+
- **代码分割**: 按组件分离
- **类型支持**: 完整 TypeScript 定义
- **性能优化**: Tree Shaking + 按需加载
- **样式处理**: SCSS + 自动注入
- **图标库**: @element-plus/icons-vue + @ant-design/icons-vue
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📄 许可证
MIT License
## 🔗 相关链接
- [Vue 3](https://vuejs.org/)
- [Element Plus Icons](https://element-plus.org/zh-CN/component/icon.html)
- [Ant Design Vue](https://antdv.com/)
- [TypeScript](https://www.typescriptlang.org/)
- [Vite](https://vitejs.dev/)
## 🚨 故障排除
### Element Plus 图标不显示问题
如果您遇到 Element Plus 图标区域显示空白占位符的问题,请按以下步骤排查:
#### 1. 检查组件注册
确保在 `main.ts` 中正确注册了组件:
```typescript
// main.ts
import { createApp } from 'vue';
import App from './App.vue';
import MenuIconComponents from 'jin-menu-icon';
const app = createApp(App);
// 确保在创建应用后立即注册
app.use(MenuIconComponents);
app.mount('#app');
```
#### 2. 手动注册图标(如果自动注册失败)
```typescript
// main.ts
import { createApp } from 'vue';
import App from './App.vue';
import MenuIconComponents, { elSvg, alSvg } from 'jin-menu-icon';
const app = createApp(App);
// 手动注册图标
elSvg(app);
alSvg(app);
// 注册组件
app.use(MenuIconComponents);
app.mount('#app');
```
#### 3. 调试图标注册状态
在组件中添加调试代码:
```vue
```
#### 4. 常见错误和解决方案
| 错误信息 | 原因 | 解决方案 |
| ------------------------------------------ | --------------------------- | ---------------------------------------- |
| `Unknown custom element: ` | Element Plus 图标组件未注册 | 确保调用了 `app.use(MenuIconComponents)` |
| `Cannot read property 'name' of undefined` | 图标库导入失败 | 检查依赖安装,重新安装组件库 |
| 图标显示为空白 | 组件注册时机不对 | 确保在 Vue 应用创建后立即注册 |
#### 5. 自动修复机制
从 v1.0.4 开始,组件库已内置自动修复机制:
- 组件会在检测到图标未注册时自动重新注册
- 控制台会显示警告信息:`[MenuIcon] 图标未正确注册,正在尝试重新注册...`
- 无需手动干预,组件会自动尝试修复
#### 6. v1.0.5 样式修复
v1.0.5 版本已修复以下问题:
- **Element Plus 图标不显示**:通过区分 Element Plus 和 Ant Design 图标的样式处理方式
- **样式冲突**:将 `el-icon` 类名改为 `menu-icon-svg`,避免与 Element Plus 内置样式冲突
- **图标大小不一致**:统一默认图标大小为 16px
#### 7. 获取帮助
如果问题仍然存在,请:
1. 检查浏览器控制台错误信息
2. 确认 Vue 版本 >= 3.3.0
3. 验证组件注册顺序
4. 提供完整的错误日志
---
## ❓ 常见问题
### Q: 安装时出现依赖冲突怎么办?
A: 使用 `--legacy-peer-deps` 参数:
```bash
npm install jin-menu-icon@1.0.5 --legacy-peer-deps
```
### Q: 组件库包含哪些依赖?
A: 组件库已内置所有图标库,包括:
- @element-plus/icons-vue 2.3.1(仅图标库)
- @ant-design/icons-vue 7.0.1
### Q: 支持哪些图标库?
A: 支持 Element Plus 和 Ant Design 两套图标库,总计 1000+ 图标(仅图标库,不依赖 UI 组件库)。
### Q: TypeScript 类型错误怎么办?
A: 确保项目使用 Vue 3.3.0+ 版本,并正确配置 TypeScript。如果仍有问题,请检查 `tsconfig.json` 配置。
### Q: 图标不显示怎么办?
A: 确保已正确安装并注册了组件库。所有图标库已内置,无需额外安装。
### Q: 样式不生效?
A: 样式会自动注入,无需手动引入。如果样式仍然不生效,请检查:
1. 确保使用的是最新版本
2. 确保组件已正确注册
3. 检查浏览器控制台是否有错误
### Q: 如何自定义样式?
A: 可以通过 CSS 变量或覆盖组件样式来自定义外观。具体请参考样式文件 `iconSelector.scss`。
### Q: 如何获取所有可用图标列表?
A: 可以通过以下方式获取:
```typescript
import { getElementPlusIconfont, getAlicdnIconfont } from 'jin-menu-icon';
// 获取 Element Plus 图标
const eleIcons = await getElementPlusIconfont();
// 获取 Ant Design 图标
const aliIcons = await getAlicdnIconfont();
```
### Q: 如何检查组件库是否正确安装?
A: 可以通过以下方式检查:
```bash
# 检查包是否安装成功
npm list jin-menu-icon
# 检查包信息
npm view jin-menu-icon
# 在代码中测试导入
import MenuIconComponents from 'jin-menu-icon';
console.log('组件库安装成功!');
```
### Q: 支持哪些 Vue 版本?
A: 组件库支持 Vue 3.3.0 及以上版本,推荐使用最新稳定版。
### Q: 如何自定义图标样式?
A: 可以通过 CSS 变量或覆盖组件样式:
```css
/* 自定义主题色 */
.icon-selector {
--primary-color: #your-color;
}
/* 自定义图标大小 */
.icon-selector .icon-item i {
font-size: 24px;
}
```
## 🚀 快速体验
想要快速体验组件库?复制以下代码到您的 Vue 项目中:
```vue
图标选择器演示
选中的图标:
{{ selectedIcon }}
```
---
**🎉 现在就开始使用 MenuIcon 组件库,享受零配置的图标选择体验!**