vue element table expand 扩展行点击行展示且保证只展示一行

本文介绍如何在Element UI的表格组件中实现单行扩展显示功能,即点击某一行时,仅展示该行的详细信息,同时收起其他行的扩展内容。通过监听表格的expand-change事件,并结合自定义方法expandSelect,可以确保任何时候只有一行处于展开状态。

背景:因为element里面的扩展行支持多行展示扩展行,但接到了需求,只能展示一行,如:第一行扩展,点击第二行的时候,第一行收起,第二行展开。同时改成点击行展示扩展内容

<el-table
        :data="eventTableData"
        style="width: 100%"
        @cell-click="clickTable"
        ref="refTable"
        @selection-change="handleSelectionChange"
        @expand-change="expandSelect"
       >
<el-table-column type="expand"  width="0px" label="扩展">

</el-table-column>

</el-table>

data:{

eventTableData:[],

expands:[],

}

methods:{

clickTable:function(row, column, cell, event){//展开事件日志列表
    if(cell.cellIndex!=3 && cell.cellIndex!=10){
        this.$refs.refTable.toggleRowExpansion(row);
    }
    this.getnoTicketReason("",row.businessType);
},
handleSelectionChange:function (val) {
console.log(val)
},
expandSelect:function (row, expandedRows) {
    var that = this
    if (expandedRows.length>1) {
        that.expands = []
        if (row) {
            that.expands.push(row);
        }
        this.$refs.refTable.toggleRowExpansion(expandedRows[0]);
    } else {
        that.expands = [];
    }
},

}

 

在使用 `el-table` 的 `type="expand"` 功能时,点击一行展开嵌套内容(如子表格或详细信息)却显示了上一行的数据,这一问题通常与 Vue 的响应式机制、组件复用策略以及数据绑定方式有关。以下是对此问题的排查思路和可能的解决方案: ### 问题分析 1. **组件复用导致的状态混乱** `el-table` 在渲染过程中会对组件进复用以提高性能。当某一行展开后,其内部状态(如展开的内容、绑定的数据)可能被保留并错误地应用到其他上。这种现象尤其容易出现在动态更新数据或重新渲染表格时。 2. **数据绑定不准确** 如果在 `expand` 插槽中直接引用了父级作用域变量而非当前的 `props.row`,可能会导致显示的数据不是当前的数据而是前一个被展开的数据。 3. **Vue 响应式系统未检测到变化** 当对对象属性进深层修改但未通过 Vue 提供的方式更新时,Vue 无法自动追踪这些变化,从而导致视图不更新或更新异常。 4. **父子结构字段命名冲突** 如引用[3]所述,如果嵌套表格中使用的字段名与树形结构的关键字(如 `children`)相同,可能导致 Element UI 内部逻辑误判,进而影响展开为[^3]。 --- ### 解决方案 #### 1. 确保使用正确的数据绑定 在 `expand` 插槽中始终使用 `props.row` 来获取当前数据,避免引用外部变量: ```html <el-table :data="tableData" style="width: 100%"> <el-table-column type="expand"> <template slot-scope="props"> <!-- 使用 props.row 获取当前数据 --> <el-table :data="props.row.detailData"> <!-- 子表格列定义 --> </el-table> </template> </el-table-column> </el-table> ``` #### 2. 避免字段命名冲突 确保嵌套结构中的字段名不与 `el-table` 的树形结构关键字冲突。例如将 `children` 改为 `subItems` 或其他非保留字段名[^3]。 #### 3. 强制更新组件实例 可以通过为每设置唯一 `row-key` 并结合 `key` 属性强制 Vue 重新创建组件实例,避免状态残留: ```html <el-table :data="tableData" row-key="id" :key="tableKey"> ``` 每次数据更新时改变 `tableKey` 的值,使整个表格重新渲染。 #### 4. 使用 Vue.set 更新响应式对象 如果需要动态添加或修改对象属性,请使用 `this.$set` 方法确保 Vue 能够追踪到变化: ```javascript this.$set(row, 'detailData', newData); ``` #### 5. 检查是否有异步操作干扰 若在点击事件中执了异步请求(如获取子数据),请确保在数据加载完成后再触发展开动作,避免因异步延迟导致数据错位。 --- ### 示例代码:正确绑定嵌套数据 ```html <el-table :data="tableData" style="width: 100%" row-key="id"> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column type="expand"> <template slot-scope="props"> <el-table :data="props.row.children || []" style="margin-left: 20px;"> <el-table-column prop="subName" label="子项名称"></el-table-column> </el-table> </template> </el-table-column> </el-table> ``` ---
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值