defaultExpandAllRows 只在 Table 首次渲染时生效一次。如果你的 tableData 是异步加载的(比如接口请求),Table 首次渲染时数据为空,等数据回来后组件不会再重新应用 defaultExpandAllRows,所以看起来"没生效"。
这是 ant-design-vue 中使用 expandedRowRender 时的常见问题,改用受控方式 expandedRowKeys 即可解决。
解决方案
用 expandedRowKeys 替代 defaultExpandAllRows,在数据加载完成后手动展开所有行:
<template>
<a-table
:columns="samplingColumns"
:data-source="tableData"
rowKey="id"
:expandedRowKeys="expandedRowKeys"
@expandedRowsChange="onExpandedRowsChange"
:pagination="false"
:scroll="{ x: 1200 }"
>
<template #expandedRowRender="{ record }">
<div>表格内容</div>
</template>
</a-table>
</template>
<script setup>
import { ref, watch } from 'vue';
const props = defineProps({
tableData: { type: Array, default: () => [] }
});
const expandedRowKeys = ref([]);
// 数据变化时自动展开所有行
watch(
() => props.tableData,
(val) => {
if (val && val.length > 0) {
expandedRowKeys.value = val.map(item => item.id);
} else {
expandedRowKeys.value = [];
}
},
{ immediate: true, deep: true }
);
const onExpandedRowsChange = (keys) => {
expandedRowKeys.value = keys;
};
</script>
关键点说明
| 问题原因 | 说明 |
|---|---|
| 异步数据 | defaultExpandAllRows 只在挂载时判断一次,数据后来才到就不会生效 |
| 受控替代 | expandedRowKeys 可以在任意时机更新,数据回来后重新设置即可展开 |
| 事件绑定 | 必须绑定 @expandedRowsChange,否则用户手动点击收起/展开会失效 |
如果你的数据不是异步的(初始化就有),请检查 rowKey="id" 是否与数据中的字段名一致,以及每条数据是否都有唯一的 id。