posts - 9,comments - 1,views - 11966

问题背景
在使用 antdv 中树形表格时,设置了默认展开所有节点属性::defaultExpandAllRows="true"。
但是在重新获取新的数据后(即经历了tableData置空再赋值),却没有再默认展开节点。

原因解析
defaultExpandAllRows这个属性仅仅是用来设置默认值的,只在第一次渲染的时候起作用,当我们获取了数据之后再重新加载时,这时已经是第N次渲染了,所以它并没有默认展开。

解决方案
方案一:
数据没有加载之前不渲染。
————————————————

// 增加 v-if
<a-table
  v-if="tableData.length"
  :defaultExpandAllRows="true"
  :columns="columns"
  :row-key="(record, index) => record.id"
  :data-source="tableData"
>
方案二:

给Table设置一个key,获取数据之后改变这个key值,借助了key改变自动变成新的component可以解决这个问题。

// 增加 key
<a-table
:key="tableKey"
:defaultExpandAllRows="true"
:columns="columns"
:row-key="(record, index) => record.id"
:data-source="tableData"
>
以上两种方案可解决大多数情况(仅仅是重新渲染数据),而我遇到的却更复杂些(涉及排序等),所以上面两种不适用,可以适用下方方案三。

方案三
获取到数据后,把有children的父节点提取出来放在一个数组里,赋值给expandedRowKeys属性,这样就实现所有父节点展开的效果了。
但是设置了expandedRowKeys属性后,点击展开收起就会失效,还需要监听expand事件手动控制展开收起

设置了expandedKeys后,Tree组件就变为受控组件了。此刻所有展开收起都要手动控制。所以还需要监听expand事件手动控制展开收起
————————————————

复制代码
// 增加 expandedKeys 和监听 expand
<a-table
  :expandedRowKeys="expandedRowKeys"
  :defaultExpandAllRows="true"
  :columns="columns"
  :row-key="(record, index) => record.id"
  :data-source="tableData"
  @expand="onTableExpand"
>


let expandedRowKeys = ref<string[]>([]);

const getExpandedRowKeys = (list) => {
    list.forEach((item) => {
      if (item.children && item.children.length) {
        // 将所有children的父节点取出
        expandedRowKeys.value.push(item.id);
        getExpandedRowKeys(item.children);
      }
    });
  };

const onTableExpand = (expanded, record) => {
    if (expanded) {
      expandedRowKeys.value.push(record.id);
    } else {
      expandedRowKeys.value.splice(expandedRowKeys.value.indexOf(record.id), 1);
    }
  };
复制代码

 



posted on   James__xu  阅读(778)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示