基于 AddressPicker 组件设计的工种选择组件,支持单选、多选和多级树形结构。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
multiple | Boolean | false | 是否支持多选 |
onlySubType | Boolean | false | 是否只选择到二级工种,不选择三级 |
showSelectWholeType | Boolean | false | 是否显示"选择整个工种"选项 |
事件名 | 说明 | 回调参数 |
---|---|---|
confirm | 确认选择时触发 | result: 选择结果对象 |
{
// 选中的工种层级
parentType: Object, // 一级工种对象
subType: Object, // 二级工种对象
detailType: Object, // 三级工种对象
// 多选时的数组
subTypes: Array, // 多选二级工种数组
detailTypes: Array, // 多选三级工种数组
// 最终选中的工种
selectedJobType: Object, // 最终选中的工种对象
// 用于后端的数据
selectedId: String, // 单选时的工种ID
selectedIds: Array, // 多选时的工种ID数组
// 显示文本
fullJobType: String // 完整的工种名称文本
}
<template>
<view>
<uv-cell
title="选择工种"
:value="selectedJobType || '请选择工种'"
@click="openJobTypePicker"
isLink
></uv-cell>
<JobTypePicker
ref="jobTypePicker"
@confirm="onJobTypeConfirm"
/>
</view>
</template>
<script>
import JobTypePicker from '@/components/JobTypePicker.vue'
export default {
components: {
JobTypePicker
},
data() {
return {
selectedJobType: ''
}
},
methods: {
openJobTypePicker() {
this.$refs.jobTypePicker.open()
},
onJobTypeConfirm(result) {
this.selectedJobType = result.fullJobType
console.log('选中的工种ID:', result.selectedId)
}
}
}
</script>
<template>
<view>
<JobTypePicker
ref="multipleJobTypePicker"
:multiple="true"
@confirm="onMultipleJobTypeConfirm"
/>
</view>
</template>
<script>
export default {
methods: {
onMultipleJobTypeConfirm(result) {
console.log('选中的工种:', result.fullJobType)
console.log('选中的工种ID数组:', result.selectedIds)
console.log('选中的工种数量:', result.selectedIds.length)
}
}
}
</script>
<template>
<view>
<JobTypePicker
ref="subTypeJobTypePicker"
:onlySubType="true"
@confirm="onSubTypeJobTypeConfirm"
/>
</view>
</template>
<script>
export default {
methods: {
onSubTypeJobTypeConfirm(result) {
// 只会返回到二级工种,不会有三级工种
console.log('选中的二级工种:', result.selectedJobType)
}
}
}
</script>
<template>
<view>
<JobTypePicker
ref="wholeJobTypePicker"
:showSelectWholeType="true"
@confirm="onWholeJobTypeConfirm"
/>
</view>
</template>
<script>
export default {
methods: {
onWholeJobTypeConfirm(result) {
// 可以选择整个工种类别
console.log('选中结果:', result)
}
}
}
</script>
组件依赖 Vuex store 中的工种数据,需要确保以下配置:
// 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)
}
})
})
}
}
确保 commonQueryJobTypeList
接口支持 pid
参数来获取子级工种:
// api.js
commonQueryJobTypeList: {
url: '/api/common/queryJobTypeList',
method: 'GET'
}
组件使用了 SCSS 变量,可以通过修改 uni-app 的主题变量来自定义样式:
// uni.scss
$uni-color: #007aff; // 主题色
id
、name
字段pid
字段建立父子关系可以参考 pages/demo/JobTypePickerDemo.vue
文件查看完整的使用示例。