原因:数据更新导致的组件重新渲染。(项目需求和element组件设计逻辑冲突,展开行默认初始化时已获取到tableData的所有数据,点击展开行时直接展示即可,项目需求为点击展开行时再获取数据动态渲染展开行)
Element Plus table 的行展开状态是由数据驱动的,如果在展开行的过程中数据发生变化,即使是非关联数据的变化,都可能触发组件的重新渲染,从而导致已展开的行被自动关闭。
解决方案:
在<el-table>增加 :expand-row-keys="expandedRowKeys"
:row-key="row => row.id",
expandChange方法获取数据后,用 :expand-row-keys="expandedRowKeys"来控制哪些行是展开的
<el-table
:data="tableData"
style="width: 100%"
stripe
border
@expand-change="expandChange"
:expand-row-keys="expandedRowKeys"
:row-key="row => row.id"
v-loading="tableLoading"
>
<el-table-column type="selection" width="50" />
<el-table-column type="expand">
<template #default="props">
<el-table :data="props.row.temp">
<el-table-column label="Name" prop="name" />
<el-table-column label="State" prop="state" />
<el-table-column label="City" prop="city" />
<el-table-column label="Address" prop="address" />
<el-table-column label="Zip" prop="zip" />
</el-table>
</template>
</el-table-column>
</el-table>
const expandedRowKeys = ref([])
const expandChange = async (val: any, expandedRows: any) => {
// 该处是用于判断是展开还是收起行,只有展开的时候做请求
if (expandedRows.length > 0) {
params.test = val.test
let temp = await getRequest(params)
val.temp = temp
// 控制展开行
expandedRowKeys.value = expandedRows.map(val => val.id);
}
}