当前位置:   article > 正文

ant-design React table表格组件合并展开错位解决_ant design框架teble组件展开标题显示问题

ant design框架teble组件展开标题显示问题

 错误现象

先看下我的需求,表格的column是后端返回,且个数不是固定的,第一列需要进行合并,第二列开始需要支持展开。
接下来是第一次尝试实现,在column里面通过items的数据筛选,确定rowSpan的值,结果就是第一列可以正常合并,但是一展开,
就会错位。

  1. const columns = [
  2. {
  3. title: '分类',
  4. dataIndex: 'sort',
  5. key: 'sort',
  6. ellipsis: true,
  7. onCell: (record: any, index: number) => {
  8. const arr = items.filter((res: any) => res.sort === record.sort);
  9. const rowSpan = index === 0 || items[index - 1].sort !== record.sort ? arr.length : 0;
  10. return {
  11. rowSpan: rowSpan,
  12. children: record.sort,
  13. };]

原因和解决思路

我这种写法rowSpan是固定的,前面第一列的合并个数是固定的,而antd的展开是相当于增加了一整行,然后页面合并就会错位。我太菜,搞不定了,求助大佬。
大佬解决思路:单击一个展开就相当于增加了一行,前面第一列的合并就需要增加一行,又因为可以同时展开多行,所以需要记录展开的位置

1. 第一步根据items计算数据,其中包含需要合并的列名称,列所在的索引位置,需要合并rowSpan的值

  1. const {
  2. data = {
  3. header: {},
  4. items: [],
  5. total: 0,
  6. },
  7. loading,
  8. run: search,
  9. } = useRequest(getOverview, {
  10. manual: true,
  11. onSuccess: res => {
  12. const arr: any[] = [];
  13. (res?.items || []).forEach((_: any, i: number) => {
  14. let obj = arr.find(item => item.sort === _.sort);
  15. if (obj) {
  16. obj.i.push(i);
  17. obj.rowSpan = obj.rowSpan + 1;
  18. } else {
  19. obj = {
  20. sort: _.sort,
  21. i: [i],
  22. rowSpan: 1,
  23. };
  24. arr.push(obj);
  25. }
  26. });
  27. setSortRowSpan(arr);
  28. },
  29. });

 打印出来的sortRowSpan长这样

 2. 修改onCell方法,根据上面计算的sortRowSpan的值,多个相同的sort设置rowSpan等于它的个数,不需要合并的sort,rowSpan设置为0

  1. onCell: (record: any, index: number) => {
  2. const item = sortRowSpan.find(_ => _.sort === record.sort);
  3. if (item) {
  4. return {
  5. rowSpan: item?.i[0] === index ? item.rowSpan : 0,
  6. };
  7. }
  8. return {};
  9. },
  10. },

3. 在table的expandable属性加上onExpand,当点击加号展开一行,rowSpan+1,点击减号收起展开,rowSpan-1

  1. expandable={{
  2. indentSize: 200,
  3. expandedRowRender: expandedRowRender,
  4. onExpand(expanded, record) {
  5. setSortRowSpan(prev => {
  6. const arr = cloneDeep(prev);
  7. const item = arr.find(i => i.sort === record.sort);
  8. item.rowSpan = expanded ? item.rowSpan + 1 : item.rowSpan - 1;
  9. return arr;
  10. });
  11. },
  12. expandedRowClassName: () => 'devops-expanded',
  13. }}

 4. 这时候问题基本解决了,展开和合并,第一列的合并没问题,但是最后一列又出现了错位,因为expandable展开的td的colspan默认和columns长度一致
但是第一列合并了,所以colspan是需要减1,现象是:

  1. useEffect(() => {
  2. const doms = document.querySelectorAll('.devops-expanded .devops-ant-table-cell');
  3. if (doms.length) {
  4. doms.forEach((_: any) => {
  5. _.colSpan = columns.length - 1;
  6. });
  7. }
  8. }, [columns]);

前端新手小白的第一篇博客,就写到这里啦~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/465536
推荐阅读