el-tree-v2 搜索数据不展开问题
<!-- 结构 -->
<el-input v-model="treeQuery" placeholder="请输入" clearable @input="onQueryChanged" />
<div class="left-tree">
<el-tree-v2 v-if="data.length"
ref="treeRef"
:data="data"
:props="props"
:height="430"
:filter-method="filterMethod"
:default-expanded-keys="expandedKeys"
:expand-on-click-node="false">
<template #default="{ node, data }">
<div class="left-slot">
<div>{{ node.label }} </div>
<div v-show="data.selectType == 1">
<el-link type="primary" @click.stop="moveIn(node, data)">移入</el-link>
</div>
</div>
</template>
</el-tree-v2>
<el-empty v-else description="暂无数据" />
</div>
const originalData = ref([])
const data = ref([])
const treeRef = ref()
const expandedKeys = computed(() => {
const keys: any = []
const getKeys = (nodes: any) => {
nodes.forEach((node: any) => {
const nodeKey = node[props.value]
if (treeQuery.value) {
if (
node.isSearchMatch ||
(node.children &&
node.children.some((child: any) => child.isSearchMatch))
) {
keys.push(nodeKey)
}
} else {
keys.push(nodeKey)
}
if (node.children && node.children.length) {
getKeys(node.children)
}
})
}
getKeys(data.value)
return keys
})
const onQueryChanged = (query: string) => {
if (!query) {
data.value = JSON.parse(JSON.stringify(originalData.value))
return
}
const filterData = (nodes: any[]): any[] => {
return nodes
.filter((node) => {
const isMatch = filterMethod(query, node)
if (node.children && node.children.length) {
const filteredChildren = filterData(node.children)
node.children = filteredChildren
return filteredChildren.length > 0 || isMatch
}
return isMatch
})
.map((node) => ({
...node,
isSearchMatch: filterMethod(query, node),
}))
}
const filteredData: any = filterData(
JSON.parse(JSON.stringify(originalData.value))
)
data.value = filteredData
}
const treeList = async () => {
try {
const res: any = await treeListApi({})
if (res.code == 200) {
const treeData = res.data || []
originalData.value = treeData
data.value = JSON.parse(JSON.stringify(treeData))
}
} catch (error) {
console.error('获取树数据失败:', error)
}
}
const filterMethod = (query: string, node: any) => {
if (!query) return true
return node.label.includes(query)
}
watch(
() => treeQuery.value,
(newVal) => {
setTimeout(() => {
if (treeRef.value) {
const currentExpandedKeys = expandedKeys.value
try {
treeRef.value.setExpandedKeys(currentExpandedKeys)
} catch (error) {
console.log('展开失败,树组件可能未完全初始化')
}
}
}, 100)
}
)