el-table tree-props 树级表格折叠搜索定位/树状表格行搜索/高亮定位/搜索定位/树结构搜索,自动展开到搜索到的行并且滚动到搜索行 - 使用Vue3(Vue2也差不多)

大概是复制即用

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'});
  	}
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
二级表格树形结构可以通过以下步骤给el-table赋值: 1. 定义表格的列属性,包括树形结构的属性,例如父节点ID和子节点ID。 2. 定义表格的数据源,包括树形结构的数据,例如父节点ID和子节点ID对应的值。 3. 在el-table组件中使用scoped slot定义每个单元格的内容,根据树形结构的属性来渲染每个节点的内容。 4. 使用递归的方式来渲染树形结构的节点,根据节点的层级关系来确定每个节点的缩进和样式。 以下是一个示例代码,演示如何给el-table赋值二级表格树形结构: ```html <template> <el-table :data="tableData" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> <el-table-column label="名称" prop="name"> <template slot-scope="{ row }"> <span :style="{ 'padding-left': (row.level - 1) * 20 + 'px' }">{{ row.name }}</span> </template> </el-table-column> <el-table-column label="类型" prop="type"></el-table-column> <el-table-column label="大小" prop="size"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { id: 1, name: '目录1', type: '目录', size: '', children: [ { id: 2, name: '文件1', type: '文件', size: '10KB', hasChildren: false }, { id: 3, name: '目录2', type: '目录', size: '', children: [ { id: 4, name: '文件2', type: '文件', size: '20KB', hasChildren: false } ], hasChildren: true } ], hasChildren: true } ] }; } }; </script> ``` 在上面的代码中,el-table组件的tree-props属性指定了树形结构的属性,即children表示子节点的数组,hasChildren表示是否有子节点。在el-table-column组件中,使用scoped slot定义了每个单元格的内容,并且根据节点的层级关系来确定每个节点的缩进和样式。最后,在data()函数中定义了表格的数据源,包括树形结构的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值