74 lines
1.4 KiB
Vue
74 lines
1.4 KiB
Vue
<template>
|
|
<el-card shadow="never">
|
|
<el-input v-model="deptName" placeholder="部门名称" clearable>
|
|
<template #prefix>
|
|
<el-icon><Search /></el-icon>
|
|
</template>
|
|
</el-input>
|
|
|
|
<el-tree
|
|
ref="deptTreeRef"
|
|
class="mt-2"
|
|
:data="deptList"
|
|
:props="{ children: 'children', label: 'label', disabled: '' }"
|
|
:expand-on-click-node="false"
|
|
:filter-node-method="handleFilter"
|
|
default-expand-all
|
|
@node-click="handleNodeClick"
|
|
/>
|
|
</el-card>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import DeptAPI from "@/api/system/dept";
|
|
|
|
const props = defineProps({
|
|
modelValue: {
|
|
type: [String, Number],
|
|
default: undefined,
|
|
},
|
|
});
|
|
|
|
// 部门树数据
|
|
const deptList = ref<OptionItem[]>();
|
|
const deptTreeRef = ref();
|
|
const deptName = ref();
|
|
|
|
const emits = defineEmits(["node-click"]);
|
|
|
|
const deptId = useVModel(props, "modelValue", emits);
|
|
|
|
watchEffect(
|
|
() => {
|
|
deptTreeRef.value.filter(deptName.value);
|
|
},
|
|
{
|
|
flush: "post",
|
|
}
|
|
);
|
|
|
|
/**
|
|
* 部门筛选
|
|
*/
|
|
function handleFilter(value: string, data: any): boolean {
|
|
if (!value) {
|
|
return true;
|
|
}
|
|
return data.label.indexOf(value) !== -1;
|
|
}
|
|
|
|
/**
|
|
* 部门树节点点击事件
|
|
*/
|
|
function handleNodeClick(data: { [key: string]: any }): void {
|
|
deptId.value = data.value;
|
|
emits("node-click");
|
|
}
|
|
|
|
onBeforeMount(() => {
|
|
DeptAPI.getOptions().then((data) => {
|
|
deptList.value = data;
|
|
});
|
|
});
|
|
</script>
|