el-table懒加载树形数据,实现整行点击的展开

本文探讨如何在项目中使用el-table处理大量数据的树状结构需求,解决箭头操作不便和懒加载挑战,通过自定义点击事件和DOM操作实现行级数据的动态加载和展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目遇到一个需求,根据集团层级展现一组数据,每个层级都可以点开看更详细的拆分数据,第一想法是用el-table的树形数据来展示,大概下面这个样子:

用过这个组件的应该知道这个只能通过点击每一行前面的小箭头实现伸缩,箭头有点小,而且表格一行的数据很长时,对用户的操作不是很友好,所以想能够点击一行的任意位置都可以进行伸缩。

1、官网中的toggleRowExpansion方法如下:

<el-table
    :data="tableData"
    ref="refTable"
    style="width: 100%"
 @row-click="expandChange"
>
</el-table>

expandChange(row,index,e){
      this.$refs.refTable.toggleRowExpansion(row)
 }

但是项目中由于数据量比较大,用了懒加载,即每次点击的时候都会去请求load接口,才能渲染下层数据,这种情况下如果没请求下级,组件的toggleRowExpansion就不好用了。

2、继续搜索,发现有一种修改css的方法,通过拉宽下拉箭头的覆盖区域实现,参见这个https://segmentfault.com/q/1010000038968399

但还是有2个问题,一个是看不到箭头了,二是只能通过点击第一列的文字实现,还是不符合预期。

3、最终通过原生的方法找到箭头的dom元素,触发一次click事件,具体实现方式如下:

<el-table 
    :data="detailData" 
    row-key="id" 
    lazy 
    :load="load" 
    :tree-props="{ children: 'children', hasChildren: 'hasChildren'}" 
    @row-click="(row,column,e)=>clickRowLoad(row,column,e)">
</el-table>


//点击整行load
clickRowLoad(r, c, e){
    console.log(e.currentTarget)
    if(e.currentTarget.firstElementChild.firstElementChild.firstElementChild.tagName=='DIV'){
      e.currentTarget.firstElementChild.firstElementChild.firstElementChild.click()
    } else {
      e.currentTarget.firstElementChild.firstElementChild.firstElementChild.nextElementSibling.click()
    }
  },

### 实现 `el-table` 组件中树形结构懒加载展开下一级节点 为了实现在 Vue3 和 Element Plus 中使用 `el-table` 的树形表格懒加载功能,并通过点击按钮来控制特定节点的子项展开,可以按照如下方式进行设置: #### 1. 安装依赖库 确保安装了最新版本的 Vue CLI 及 Element Plus。 ```bash npm install @element-plus/icons-vue@latest ``` #### 2. 创建 TreeTable.vue 文件 创建一个新的组件文件用于展示带有懒加载特性的树状表单。此部分代码展示了如何配置基础属性以及监听事件处理函数[^1]。 ```vue <template> <div class="tree-table"> <button @click="toggleExpandAll">Toggle Expand All</button> <el-table :data="tableData" row-key="id" lazy :load="load" border style="width: 100%"> <!-- 表格列定义 --> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="size" label="Size"></el-table-column> <el-table-column prop="type" label="Type"></el-table-column> </el-table> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; let tableData = ref([ { id: 1, name: "Folder A", size: "-", type: "folder", hasChildren: true, // 子节点标记 }, ]); // 加载子节点的数据方法 const load = async (row, treeNode, resolve) => { setTimeout(() => { const data = [ { id: `${row.id}-child`, name: "Child File.txt", size: "1KB", type: "file" } ]; resolve(data); }, 1000); // 模拟异步请求延迟 }; // 切换所有行的状态的方法 function toggleExpandAll() { let allExpanded = !tableData.value.some(item => item._expanded === false); function setExpansion(row) { if (!('children' in row)) return; Object.assign(row, {_expanded: allExpanded}); if ('children' in row && Array.isArray(row.children)) for (let child of row.children) setExpansion(child); } for (let rowData of tableData.value){ setExpansion(rowData); } } </script> ``` 上述代码实现了基本的功能需求,即当用户点击“Toggle Expand All”按钮时,会触发 `toggleExpandAll()` 函数逻辑判断当前是否有任何一项处于未展开状态;如果有,则将其余所有的父级节点及其后代都设为已展开;反之则全部收缩起来。同时,在初始化数据时给定了一些初始记录作为顶层目录显示出来。 对于更复杂的场景比如动态获取远程API返回的结果集,可以在 `load` 方法内部替换掉模拟延时操作的部分,改为实际发起HTTP请求去取得对应ID下的子元素列表[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值