<template>
<a-spin :spinning="loading">
<div class="tree-container">
<a-input-search v-model:value="searchValue" style="margin-bottom: 8px" placeholder="請(qǐng)輸入" />
<a-tree v-model:expandedKeys="expandedKeys" v-model:auto-expand-parent="autoExpandParent"
v-model:selectedKeys="selectedKeys" :showIcon="true" :checkable="false" v-if="treeData" :tree-data="treeData"
@click.stop="clickTree" :field-names="{ title: 'name', key: 'id' }">
<template #title="{ children, name, id, level }">
<div class="flex f-between">
<div class="mr-30">
<span v-if="name.indexOf(searchValue) > -1">
{{ name.substring(0, name.indexOf(searchValue)) }}
<span style="color: var(--main-color)">{{ searchValue }}</span>
{{ name.substring(name.indexOf(searchValue) + searchValue.length) }}
</span>
<span v-else>{{ name }}</span>
</div>
<div style="display: inline-block;">
<a-dropdown trigger="click">
<span> ···</span>
<template #overlay>
<a-menu @click="(item, key) => onMenuClick(item)">
<a-menu-item v-for="item in operateList(level)" :key="item.value" :label="item.label"
:string="item.orgString">{{ item.label
}}</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
</div>
</template>
</a-tree>
</div>
</a-spin>
</template>
<script setup lang="ts">
import { ref, reactive, toRefs, onMounted, onBeforeUnmount, watch } from 'vue'
import { useStore } from '@/store/index'
import emitter from '@/utils/eventBus';
import { getdepartmentList } from '@/request/department'
import { message, type TreeProps } from 'ant-design-vue';
const emit = defineEmits(['openDrawer', 'update:open'])
const store = useStore()
const operateList = (level) => {
let add = { label: '新增子部門', value: '11', orgString: 'addEditDepartment', }
let otherOperate = [
{ label: '編輯部門', value: '12', orgString: 'addEditDepartment', },
{ label: '移動(dòng)部門和所有人', value: '13', orgString: 'moveDepartment', },
{ label: '僅移動(dòng)人員', value: '14', orgString: 'movePerson', },
{ label: '刪除', value: '15', orgString: 'deleteOrganization', },
]
return level < 3 ? [add, ...otherOperate] : otherOperate
}
const searchValue = ref('')
const treeData = ref()
const selectedKeys = ref<string[]>([]);
// const checkedKeys = ref<string[]>(['2','5']);
const onMenuClick = (item) => {
selectTreeInfo.value.operateTitle = item.item.label
selectTreeInfo.value.operateKey = item.key
selectTreeInfo.value.orgComponent = item.item.string
emit('openDrawer', selectTreeInfo.value)
}
const loading = ref(false)
let selectTreeInfo: any = ref({})
const clickTree = (data, info) => {
selectTreeInfo.value = info
emit('openDrawer', selectTreeInfo.value)
}
// 獲取列表
const getDepartment = () => {
loading.value = true
getdepartmentList().then((res: any) => {
if (res.code === 200) {
treeData.value = res.data
expandedKeys.value = [res.data[0].id] // 默認(rèn)展開第一級(jí)部門
generateList(res.data)
} else {
message.error(res.message)
}
loading.value = false
}).catch((err) => {
loading.value = false
})
}
getDepartment()
defineExpose({ getDepartment })
const dataList = [];
const getParentKey = (key, tree,) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some(item => item.id === key)) {
parentKey = node.id;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
const generateList = (data) => {
for (let i = 0; i < data.length; i++) {
const node = data[i];
const key = node.id;
dataList.push({ key, title: node.name });
if (node.children) {
generateList(node.children);
}
}
};
const expandedKeys = ref([]);
const autoExpandParent = ref(true);
watch(() => searchValue.value, value => {
const expanded = dataList
.map((item) => {
if (item.title.indexOf(value) > -1) {
return getParentKey(item.key, treeData.value);
}
return null;
})
.filter((item, i, self) => item && self.indexOf(item) === i);
expandedKeys.value = expanded;
});
</script>
<style scoped lang="less">
.tree-container {
padding: 20px;
height: calc(100vh - 100px);
min-width: 300px;
border: 1px solid #ccc;
overflow: auto;
box-shadow: 1px 1px 10px #ccc;
}
</style>
2024-12-17 樹形圖帶查詢功能
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 最近接到需求把兩個(gè)關(guān)聯(lián)的表格整改成樹形結(jié)構(gòu)圖,如上圖所示。需要滿足的要求:1.勾選父級(jí),子集不勾選。2.子集顯示默...
- Tree View; Mind map; Think map; tree map; 樹狀圖;思維導(dǎo)圖;組織結(jié)構(gòu)圖;...
- 兒童思維訓(xùn)練課系列,受用一生的思維習(xí)慣 連載文章目錄 (點(diǎn)擊藍(lán)字可閱讀前兩篇微課筆記) 1.圓圈圖 2.流程圖和氣...
- 《八大邏輯圖》中介紹,樹形圖是訓(xùn)練分類能力的工具,也是進(jìn)行思維訓(xùn)練的重要工具之一。因?yàn)榉诸愒谖覀兊纳?、學(xué)習(xí)和工作...