index.vue 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script setup lang="ts">
  2. import { getTreeApi } from '@/api/system/dept'
  3. import { StrAnyObjArr } from '@/typings'
  4. const props = withDefaults(
  5. defineProps<{
  6. modelValue?: string | Array<string>
  7. showTop?: boolean
  8. multiple?: boolean
  9. disabled?: boolean
  10. }>(),
  11. {
  12. showTop: false,
  13. multiple: false,
  14. disabled: false
  15. }
  16. )
  17. const computedModelValue = computed({
  18. get() {
  19. return props.modelValue
  20. },
  21. set(newValue) {
  22. emits('update:modelValue', newValue)
  23. }
  24. })
  25. const emits = defineEmits(['update:modelValue'])
  26. const treeSelectRef = ref()
  27. const treeData = ref<StrAnyObjArr>([])
  28. async function load(filterNodeKey?: string) {
  29. return getTreeApi({}).then((resp) => {
  30. if (props.showTop) {
  31. treeData.value = [{ id: '0', name: '顶级部门', children: resp }]
  32. } else {
  33. treeData.value = resp
  34. }
  35. if (filterNodeKey) {
  36. nextTick(() => treeSelectRef.value.remove(treeSelectRef.value.getNode(filterNodeKey)))
  37. }
  38. })
  39. }
  40. defineExpose({ load })
  41. </script>
  42. <template>
  43. <el-tree-select
  44. ref="treeSelectRef"
  45. v-model="computedModelValue"
  46. :data="treeData"
  47. :props="{ label: 'name' }"
  48. :multiple="multiple"
  49. :disabled="disabled"
  50. node-key="id"
  51. placeholder="请选择部门"
  52. filterable
  53. clearable
  54. check-strictly
  55. default-expand-all
  56. />
  57. </template>