# JobTypePicker 工种选择组件
基于 AddressPicker 组件设计的工种选择组件,支持单选、多选和多级树形结构。
## 功能特性
- ✅ **单选模式**:选择单个工种
- ✅ **多选模式**:支持选择多个工种
- ✅ **多级树形结构**:支持一级、二级、三级工种选择
- ✅ **灵活配置**:可配置只选择到二级工种
- ✅ **整个工种选择**:支持选择整个工种类别
- ✅ **数据缓存**:自动缓存已加载的工种数据
- ✅ **响应式设计**:适配不同屏幕尺寸
## 组件属性
| 属性名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| multiple | Boolean | false | 是否支持多选 |
| onlySubType | Boolean | false | 是否只选择到二级工种,不选择三级 |
| showSelectWholeType | Boolean | false | 是否显示"选择整个工种"选项 |
## 事件
| 事件名 | 说明 | 回调参数 |
|--------|------|----------|
| confirm | 确认选择时触发 | result: 选择结果对象 |
## 返回数据结构
```javascript
{
// 选中的工种层级
parentType: Object, // 一级工种对象
subType: Object, // 二级工种对象
detailType: Object, // 三级工种对象
// 多选时的数组
subTypes: Array, // 多选二级工种数组
detailTypes: Array, // 多选三级工种数组
// 最终选中的工种
selectedJobType: Object, // 最终选中的工种对象
// 用于后端的数据
selectedId: String, // 单选时的工种ID
selectedIds: Array, // 多选时的工种ID数组
// 显示文本
fullJobType: String // 完整的工种名称文本
}
```
## 基本用法
### 1. 单选模式
```vue
```
### 2. 多选模式
```vue
```
### 3. 只选择到二级工种
```vue
```
### 4. 带"选择整个工种"选项
```vue
```
## 数据源配置
组件依赖 Vuex store 中的工种数据,需要确保以下配置:
### 1. store.js 配置
```javascript
// state 中添加
state: {
jobTypeList: [], // 一级工种列表
jobTypeTreeMap: {} // 多级工种映射
}
// mutations 中添加
mutations: {
setChildJobTypeList(state, { pid, list }) {
state.jobTypeTreeMap[pid] = list
}
}
// actions 中添加
actions: {
async getChildJobTypeList({ state, commit }, pid) {
if(state.jobTypeTreeMap[pid]) {
return Promise.resolve(state.jobTypeTreeMap[pid])
}
return new Promise((resolve, reject) => {
api('commonQueryJobTypeList', {
pageNo: 1,
pageSize: 99999,
pid: pid
}, res => {
if(res.code == 200) {
commit('setChildJobTypeList', { pid, list: res.result.records })
resolve(res.result.records)
} else {
reject(res)
}
})
})
}
}
```
### 2. API 接口
确保 `commonQueryJobTypeList` 接口支持 `pid` 参数来获取子级工种:
```javascript
// api.js
commonQueryJobTypeList: {
url: '/api/common/queryJobTypeList',
method: 'GET'
}
```
## 样式自定义
组件使用了 SCSS 变量,可以通过修改 uni-app 的主题变量来自定义样式:
```scss
// uni.scss
$uni-color: #007aff; // 主题色
```
## 注意事项
1. **数据格式**:工种数据需要包含 `id`、`name` 字段
2. **层级关系**:通过 `pid` 字段建立父子关系
3. **缓存机制**:已加载的工种数据会自动缓存,避免重复请求
4. **错误处理**:当获取子级工种失败时,会自动确认当前选择
5. **性能优化**:使用了 scroll-view 组件,支持大量数据的流畅滚动
## 示例页面
可以参考 `pages/demo/JobTypePickerDemo.vue` 文件查看完整的使用示例。
## 依赖组件
- uv-popup:弹窗组件
- uv-icon:图标组件
- uv-cell:单元格组件(示例中使用)
## 兼容性
- ✅ H5
- ✅ 小程序
- ✅ App
## 更新日志
### v1.0.0
- 初始版本
- 支持单选、多选、多级树形结构
- 支持数据缓存和错误处理