dept-tree.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <!-- 部门树 -->
  2. <template>
  3. <el-card shadow="never">
  4. <el-input v-model="deptName" placeholder="部门名称" clearable>
  5. <template #prefix>
  6. <i-ep-search />
  7. </template>
  8. </el-input>
  9. <el-tree
  10. ref="deptTreeRef"
  11. class="mt-2"
  12. :data="deptList"
  13. :props="{ children: 'children', label: 'label', disabled: '' }"
  14. :expand-on-click-node="false"
  15. :filter-node-method="handleFilter"
  16. default-expand-all
  17. @node-click="handleNodeClick"
  18. />
  19. </el-card>
  20. </template>
  21. <script setup lang="ts">
  22. import { treeList } from "@/api/system/dept";
  23. const props = defineProps({
  24. modelValue: {
  25. type: [Number],
  26. default: undefined,
  27. },
  28. });
  29. const deptList = ref<OptionType[]>(); // 部门列表
  30. const deptTreeRef = ref(ElTree); // 部门树
  31. const deptName = ref(); // 部门名称
  32. const emits = defineEmits(["node-click"]);
  33. const deptId = useVModel(props, "modelValue", emits);
  34. watchEffect(
  35. () => {
  36. deptTreeRef.value.filter(deptName.value);
  37. },
  38. {
  39. flush: "post", // watchEffect会在DOM挂载或者更新之前就会触发,此属性控制在DOM元素更新后运行
  40. }
  41. );
  42. /** 部门筛选 */
  43. function handleFilter(value: string, data: any) {
  44. if (!value) {
  45. return true;
  46. }
  47. return data.label.indexOf(value) !== -1;
  48. }
  49. /** 部门树节点 Click */
  50. function handleNodeClick(data: { [key: string]: any }) {
  51. deptId.value = data.value;
  52. emits("node-click");
  53. }
  54. onBeforeMount?.(() => {
  55. treeList().then((response) => {
  56. deptList.value = response.data;
  57. });
  58. });
  59. </script>