大概是复制即用
1、表格与搜索框代码
<!-- 搜索文本框 -->
<el-input v-model="searchName" placeholder="搜索" size="small" @blur="inputSearch" clearable/>
<!-- 这是树状表格 deptKey是每行的唯一键() -->
<el-table ref="myTable" :data="tableData" row-key="deptKey" :tree-props="{ children: 'children', hasChildren: true }">
<el-table-column prop="name" label="部门/人员" width="120" align="center">
<template #default="scope">
<span :id="'row-'+ scope.row.deptKey">{{scope.row.name}}</span>
</template>
</el-table-column>
</el-table>
2、Js代码
import { ref, nextTick } from "vue";
// 表格ref
const myTable = ref(null);
// 搜索文本框值
const searchName = ref([]);
// 表格数据 deptKey 必须得按测试例的这种格式(每一级必需拼上上一级的id)
const tableData = ref([{
id: 0,
name: "一级部门-1",
deptKey: "0",
children: [{
id: 20,
name: "二级部门-1",
deptKey: "0-20",
children: [{
id: 30,
name: "王大锤",
deptKey: "0-20-30"
}]
}]
},{
id: 1,
name: "一级部门-2",
deptKey: "1",
children: [{
id: 40,
name: "二级部门-2",
deptKey: "1-40",
children: [{
id: 50,
name: "李大锤",
deptKey: "1-40-50",
}]
}]
}]);
/** 搜索文本框触发方法 **/
function inputSearch () {
let data = tableData.value;
if (data && data.length > 0) {
// 折叠树结构
shrinkTableTree(data);
// 如果搜索框为空,则不执行任何操作
if (searchName.value === '') {
return;
}
// 再展开定位到的位置
expandAndHighlight(data);
}
}
/** 折叠行 **/
function shrinkTableTree(data) {
// 强制收缩第一行(第一行在下面循环关闭不了)
myTable.value.toggleRowExpansion(data[0], false);
for (const row of data) {
if (row.children && row.children.length > 0) {
shrinkTableTree(row.children);
}
myTable.value.toggleRowExpansion(row, false);
}
}
/** 表格展开与高亮 **/
function expandAndHighlight (data) {
for (const row of data) {
// 按tableData表格数据中name模糊搜索
if (row.name.includes(searchName.value)) {
// 切换行的展开状态
myTable.value.toggleRowExpansion(row);
// 高亮当前行
myTable.value.setCurrentRow(row);
// 定位到行
nextTick(() => scrollToRow(row));
return true;
}
if (row.children && row.children.length > 0) {
const found = expandAndHighlight(row.children);
if (found) {
// 确保父级也被展开
myTable.value.toggleRowExpansion(row, true);
return true;
}
}
}
return false;
}
/** 定位到行 **/
function scrollToRow(row) {
// 获取表格设置的行id
const rowElement = document.getElementById(`row-${row.deptKey}`);
if (rowElement) {
rowElement.scrollIntoView({behavior: 'smooth', block: 'center'});
}
}