DeptSelect.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <el-select
  3. :model-value="modelValue"
  4. :placeholder="placeholder"
  5. :clearable="clearable"
  6. :multiple="multiple"
  7. :collapse-tags="collapseTags"
  8. :collapse-tags-tooltip="collapseTagsTooltip"
  9. class="!w-240px"
  10. @update:model-value="handleChange"
  11. @clear="handleClear"
  12. >
  13. <el-option
  14. v-for="dept in deptList"
  15. :key="dept.id"
  16. :label="dept.name"
  17. :value="dept.id"
  18. />
  19. </el-select>
  20. </template>
  21. <script setup lang="ts">
  22. import { getSimpleDeptList } from '@/api/system/dept'
  23. import type { DeptVO } from '@/api/system/dept'
  24. import { PropType } from 'vue'
  25. const props = defineProps({
  26. modelValue: {
  27. type: [String, Array] as PropType<string | string[] | undefined>,
  28. default: undefined
  29. },
  30. placeholder: {
  31. type: String,
  32. default: '请选择部门'
  33. },
  34. clearable: {
  35. type: Boolean,
  36. default: true
  37. },
  38. multiple: {
  39. type: Boolean,
  40. default: false
  41. },
  42. collapseTags: {
  43. type: Boolean,
  44. default: true
  45. },
  46. collapseTagsTooltip: {
  47. type: Boolean,
  48. default: true
  49. }
  50. })
  51. const emit = defineEmits(['update:modelValue', 'change', 'clear'])
  52. const deptList = ref<DeptVO[]>([])
  53. // 获取部门列表
  54. const getDeptOptions = async () => {
  55. const res = await getSimpleDeptList()
  56. deptList.value = res
  57. }
  58. // 处理选择变化
  59. const handleChange = (value: string | string[]) => {
  60. console.log(value)
  61. emit('update:modelValue', value)
  62. emit('change', value)
  63. }
  64. // 处理清除
  65. const handleClear = () => {
  66. emit('update:modelValue', undefined)
  67. emit('change', undefined)
  68. emit('clear')
  69. }
  70. // 组件挂载时获取部门列表
  71. onMounted(() => {
  72. getDeptOptions()
  73. })
  74. </script>