antd中table组件使用defaultExpandAllRows“失效”后的解决方法

11 阅读1分钟

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。