特易招,招聘小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
5.8 KiB

  1. # JobTypePicker 工种选择组件
  2. 基于 AddressPicker 组件设计的工种选择组件,支持单选、多选和多级树形结构。
  3. ## 功能特性
  4. -**单选模式**:选择单个工种
  5. -**多选模式**:支持选择多个工种
  6. -**多级树形结构**:支持一级、二级、三级工种选择
  7. -**灵活配置**:可配置只选择到二级工种
  8. -**整个工种选择**:支持选择整个工种类别
  9. -**数据缓存**:自动缓存已加载的工种数据
  10. -**响应式设计**:适配不同屏幕尺寸
  11. ## 组件属性
  12. | 属性名 | 类型 | 默认值 | 说明 |
  13. |--------|------|--------|------|
  14. | multiple | Boolean | false | 是否支持多选 |
  15. | onlySubType | Boolean | false | 是否只选择到二级工种,不选择三级 |
  16. | showSelectWholeType | Boolean | false | 是否显示"选择整个工种"选项 |
  17. ## 事件
  18. | 事件名 | 说明 | 回调参数 |
  19. |--------|------|----------|
  20. | confirm | 确认选择时触发 | result: 选择结果对象 |
  21. ## 返回数据结构
  22. ```javascript
  23. {
  24. // 选中的工种层级
  25. parentType: Object, // 一级工种对象
  26. subType: Object, // 二级工种对象
  27. detailType: Object, // 三级工种对象
  28. // 多选时的数组
  29. subTypes: Array, // 多选二级工种数组
  30. detailTypes: Array, // 多选三级工种数组
  31. // 最终选中的工种
  32. selectedJobType: Object, // 最终选中的工种对象
  33. // 用于后端的数据
  34. selectedId: String, // 单选时的工种ID
  35. selectedIds: Array, // 多选时的工种ID数组
  36. // 显示文本
  37. fullJobType: String // 完整的工种名称文本
  38. }
  39. ```
  40. ## 基本用法
  41. ### 1. 单选模式
  42. ```vue
  43. <template>
  44. <view>
  45. <uv-cell
  46. title="选择工种"
  47. :value="selectedJobType || '请选择工种'"
  48. @click="openJobTypePicker"
  49. isLink
  50. ></uv-cell>
  51. <JobTypePicker
  52. ref="jobTypePicker"
  53. @confirm="onJobTypeConfirm"
  54. />
  55. </view>
  56. </template>
  57. <script>
  58. import JobTypePicker from '@/components/JobTypePicker.vue'
  59. export default {
  60. components: {
  61. JobTypePicker
  62. },
  63. data() {
  64. return {
  65. selectedJobType: ''
  66. }
  67. },
  68. methods: {
  69. openJobTypePicker() {
  70. this.$refs.jobTypePicker.open()
  71. },
  72. onJobTypeConfirm(result) {
  73. this.selectedJobType = result.fullJobType
  74. console.log('选中的工种ID:', result.selectedId)
  75. }
  76. }
  77. }
  78. </script>
  79. ```
  80. ### 2. 多选模式
  81. ```vue
  82. <template>
  83. <view>
  84. <JobTypePicker
  85. ref="multipleJobTypePicker"
  86. :multiple="true"
  87. @confirm="onMultipleJobTypeConfirm"
  88. />
  89. </view>
  90. </template>
  91. <script>
  92. export default {
  93. methods: {
  94. onMultipleJobTypeConfirm(result) {
  95. console.log('选中的工种:', result.fullJobType)
  96. console.log('选中的工种ID数组:', result.selectedIds)
  97. console.log('选中的工种数量:', result.selectedIds.length)
  98. }
  99. }
  100. }
  101. </script>
  102. ```
  103. ### 3. 只选择到二级工种
  104. ```vue
  105. <template>
  106. <view>
  107. <JobTypePicker
  108. ref="subTypeJobTypePicker"
  109. :onlySubType="true"
  110. @confirm="onSubTypeJobTypeConfirm"
  111. />
  112. </view>
  113. </template>
  114. <script>
  115. export default {
  116. methods: {
  117. onSubTypeJobTypeConfirm(result) {
  118. // 只会返回到二级工种,不会有三级工种
  119. console.log('选中的二级工种:', result.selectedJobType)
  120. }
  121. }
  122. }
  123. </script>
  124. ```
  125. ### 4. 带"选择整个工种"选项
  126. ```vue
  127. <template>
  128. <view>
  129. <JobTypePicker
  130. ref="wholeJobTypePicker"
  131. :showSelectWholeType="true"
  132. @confirm="onWholeJobTypeConfirm"
  133. />
  134. </view>
  135. </template>
  136. <script>
  137. export default {
  138. methods: {
  139. onWholeJobTypeConfirm(result) {
  140. // 可以选择整个工种类别
  141. console.log('选中结果:', result)
  142. }
  143. }
  144. }
  145. </script>
  146. ```
  147. ## 数据源配置
  148. 组件依赖 Vuex store 中的工种数据,需要确保以下配置:
  149. ### 1. store.js 配置
  150. ```javascript
  151. // state 中添加
  152. state: {
  153. jobTypeList: [], // 一级工种列表
  154. jobTypeTreeMap: {} // 多级工种映射
  155. }
  156. // mutations 中添加
  157. mutations: {
  158. setChildJobTypeList(state, { pid, list }) {
  159. state.jobTypeTreeMap[pid] = list
  160. }
  161. }
  162. // actions 中添加
  163. actions: {
  164. async getChildJobTypeList({ state, commit }, pid) {
  165. if(state.jobTypeTreeMap[pid]) {
  166. return Promise.resolve(state.jobTypeTreeMap[pid])
  167. }
  168. return new Promise((resolve, reject) => {
  169. api('commonQueryJobTypeList', {
  170. pageNo: 1,
  171. pageSize: 99999,
  172. pid: pid
  173. }, res => {
  174. if(res.code == 200) {
  175. commit('setChildJobTypeList', { pid, list: res.result.records })
  176. resolve(res.result.records)
  177. } else {
  178. reject(res)
  179. }
  180. })
  181. })
  182. }
  183. }
  184. ```
  185. ### 2. API 接口
  186. 确保 `commonQueryJobTypeList` 接口支持 `pid` 参数来获取子级工种:
  187. ```javascript
  188. // api.js
  189. commonQueryJobTypeList: {
  190. url: '/api/common/queryJobTypeList',
  191. method: 'GET'
  192. }
  193. ```
  194. ## 样式自定义
  195. 组件使用了 SCSS 变量,可以通过修改 uni-app 的主题变量来自定义样式:
  196. ```scss
  197. // uni.scss
  198. $uni-color: #007aff; // 主题色
  199. ```
  200. ## 注意事项
  201. 1. **数据格式**:工种数据需要包含 `id`、`name` 字段
  202. 2. **层级关系**:通过 `pid` 字段建立父子关系
  203. 3. **缓存机制**:已加载的工种数据会自动缓存,避免重复请求
  204. 4. **错误处理**:当获取子级工种失败时,会自动确认当前选择
  205. 5. **性能优化**:使用了 scroll-view 组件,支持大量数据的流畅滚动
  206. ## 示例页面
  207. 可以参考 `pages/demo/JobTypePickerDemo.vue` 文件查看完整的使用示例。
  208. ## 依赖组件
  209. - uv-popup:弹窗组件
  210. - uv-icon:图标组件
  211. - uv-cell:单元格组件(示例中使用)
  212. ## 兼容性
  213. - ✅ H5
  214. - ✅ 小程序
  215. - ✅ App
  216. ## 更新日志
  217. ### v1.0.0
  218. - 初始版本
  219. - 支持单选、多选、多级树形结构
  220. - 支持数据缓存和错误处理