# Uni-App-X 组件库规范 - CRMEB 风格
## 📚 概述
本文档定义了 mall 项目中可复用组件的开发规范,参考 CRMEB 的组件库设计。所有组件必须遵循此规范。
---
## 1. 组件分类体系
```
components/
├── basic/ # 基础组件
│ ├── Button.uvue
│ ├── Input.uvue
│ ├── Select.uvue
│ ├── Checkbox.uvue
│ ├── Radio.uvue
│ └── ...
├── container/ # 容器组件
│ ├── Card.uvue
│ ├── Modal.uvue
│ ├── Drawer.uvue
│ └── ...
├── data/ # 数据展示组件
│ ├── Table.uvue
│ ├── List.uvue
│ ├── Tree.uvue
│ └── ...
├── form/ # 表单组件
│ ├── Form.uvue
│ ├── FormItem.uvue
│ ├── DatePicker.uvue
│ └── ...
├── feedback/ # 反馈组件
│ ├── Message.uvue
│ ├── Toast.uvue
│ ├── Modal.uvue
│ └── ...
└── navigation/ # 导航组件
├── Tabs.uvue
├── Breadcrumb.uvue
└── ...
```
---
## 2. 基础组件规范
### 2.1 Button(按钮)
#### 特性
- 4 种类型: primary / default / danger / success
- 3 种尺寸: sm / md / lg
- 支持禁用和加载状态
- 支持前置和后置图标
#### 代码示例
```uvue
```
#### 使用示例
```uvue
```
### 2.2 Input(输入框)
#### 特性
- 支持不同类型: text / password / number / email
- 支持前缀和后缀插槽
- 支持验证状态反馈
- 支持 clearable 清空功能
#### 代码示例
```uvue
{{ prefix }}
{{ suffix }}
{{ error }}
```
### 2.3 Select(下拉选择)
#### 特性
- 支持单选和多选
- 支持搜索过滤
- 支持虚拟滚动(大数据)
- 支持自定义选项模板
#### 示例
```uvue
{{ selectedLabel || placeholder }}
▼
{{ option.label }}
```
---
## 3. 容器组件规范
### 3.1 Card(卡片)
```uvue
```
### 3.2 Modal(模态框)
```uvue
```
---
## 4. 表单组件规范
### 4.1 Form(表单容器)
```uvue
```
### 4.2 FormItem(表单项)
```uvue
{{ error }}
```
---
## 5. 数据展示组件规范
### 5.1 Table(表格)
核心要点:
- 支持排序和筛选
- 支持行选择
- 支持固定列头
- 支持虚拟滚动
```uvue
{{ row[col.key] }}
```
---
## 6. 反馈组件规范
### 6.1 Message(消息提示)
```uvue
{{ msg.content }}
```
---
## 7. 组件命名规范
### 7.1 文件命名
- 使用 **PascalCase**(帕斯卡命名法)
- 例如: `Button.uvue`, `FormItem.uvue`, `TableCell.uvue`
### 7.2 Props 命名
- 使用 **camelCase**(驼峰命名法)
- 例如: `modelValue`, `isLoading`, `onConfirm`
### 7.3 事件命名
- 使用 **camelCase**(驼峰命名法)
- 例如: `@click`, `@change`, `@submit`
### 7.4 Slot 命名
- 使用 **kebab-case**(短横线命名法)
- 例如: ``, ``
### 7.5 Class 命名
- 使用 **kebab-case**(短横线命名法)
- 例如: `.form-item`, `.btn-primary`, `.list-item`
---
## 8. Props 和 Emit 规范
### 8.1 Props 验证
```typescript
interface ButtonProps {
type?: "primary" | "default" | "danger" | "success";
size?: "sm" | "md" | "lg";
label: string;
disabled?: boolean;
loading?: boolean;
}
const props = withDefaults(defineProps(), {
type: "primary",
size: "md",
disabled: false,
loading: false,
});
```
### 8.2 Emit 验证
```typescript
const emit = defineEmits<{
click: [];
change: [value: string];
submit: [formData: Record];
}>();
```
---
## 9. 组件文档模板
每个组件都应包含以下文档:
```markdown
# Button 组件
## 描述
按钮组件,支持多种类型和尺寸。
## Props
| 属性 | 类型 | 默认值 | 说明 |
| -------- | ------- | ------- | ---------------------------------------- |
| type | string | primary | 按钮类型: primary/default/danger/success |
| size | string | md | 按钮尺寸: sm/md/lg |
| label | string | - | 按钮文本 |
| disabled | boolean | false | 是否禁用 |
| loading | boolean | false | 是否加载中 |
## Events
| 事件 | 参数 | 说明 |
| ----- | ---- | -------- |
| click | - | 点击事件 |
## Slots
无
## 示例
\`\`\`vue
\`\`\`
```
---
## 10. 组件开发清单
在开发新组件前,确保已完成以下事项:
- [ ] 组件放在正确的分类目录
- [ ] 组件名称遵循 PascalCase
- [ ] Props 已定义 TypeScript 接口
- [ ] Emit 事件已定义类型
- [ ] 样式变量全部来自 uni.scss
- [ ] 支持响应式设计
- [ ] 提供了完整的使用示例
- [ ] 编写了 JSDoc 文档
- [ ] 测试通过(所有状态)
- [ ] 无 console.log 和调试代码
---
## 11. 常见模式
### 11.1 v-model 支持
```typescript
// Props
const props = defineProps<{
modelValue?: string;
}>();
// Emit
const emit = defineEmits<{
"update:modelValue": [value: string];
}>();
// 使用
const handleChange = (value: string) => {
emit("update:modelValue", value);
};
```
### 11.2 插槽使用
```uvue
头部
内容
底部
```
### 11.3 条件渲染
```uvue
```
---
## 总结
✅ **组件开发核心原则**:
1. **单一职责** - 每个组件只做一件事
2. **可复用性** - 组件应该能在多个场景使用
3. **灵活性** - 提供足够的 Props 和 Slots 来自定义
4. **可维护性** - 清晰的代码结构和充分的文档
5. **性能** - 避免不必要的渲染和内存泄漏
❌ **禁止做法**:
- 在组件中混合业务逻辑
- 创建过度抽象的组件
- 使用硬编码的样式值
- 忽视响应式设计
- 没有文档的组件
---
**文档版本**: 1.0
**最后更新**: 2026-01-31
**维护者**: AI Assistant