react的table合并行时,出现border-bottom重复问题

本文讲述了如何在使用AntDesign的表格组件时,根据rowSpanNum合并行数据并修复由于合并导致的border-bottom样式问题。作者提供了解决方案,通过计算后续行的rowSpanNum值来动态设置td的border-bottom样式。
摘要由CSDN通过智能技术生成

背景:

需求是呈现一个表格,根据操作人跟操作时间是否相同来进行合并行数据

数据结构:

经过跟后端的同事商量,需要在每一行数据中返回rowSpanNum的值,前端在column中根据值来判断是否满足合并行(没有合并行是rowSpanNum值是1,有合并行时,第一行的值大于1,接下来的几行值是null

[
    {
        ...,
        rowSpanNum: 1,
    },
    {
        ...,
        rowSpanNum: 3,
    },
    {
        ...,
        rowSpanNum: null,
    },
    {
        ...,
        rowSpanNum: null,
    },
    {
        ...,
        rowSpanNum: 1,
    },
]

前端处理column:

在column的render里面,我们可以定义一个obj对象,给obj对象的rowSpan属性进行赋值处理,再将obj返回即可

const columns = [
      {
        title: '数量',
        dataIndex: '数量',
        width: '80px',
        align: 'right'
      },
      {
        title: '日期',
        dataIndex: '日期',
        width: '90px'
      },
      {
        title: '备注',
        dataIndex: '备注',
      },
      {
        title: '操作人',
        dataIndex: 'createName',
        width: '80px',
        render: (text, record, index) => {
          const obj = {
            children: isShowPopover(text),
            props: {
            },
          };
          if(record.rowSpanNum){
            obj.props.rowSpan = record.rowSpanNum;
          }else{
            obj.props.rowSpan = 0;
          }
          return obj;
        },
      },
      {
        title: '操作时间',
        dataIndex: 'createTime',
        width: '140px',
        render: (text, record, index) => {
          const obj = {
            children: text,
            props: {
            },
          };
          if(record.rowSpanNum){
            obj.props.rowSpan = record.rowSpanNum;
          }else{
            obj.props.rowSpan = 0;
          }
          return obj;
        },
      },
    ]

效果如图:

存在问题:antd针对table的最后一个tr做了border-bottom: 0;的处理,但是由于合并的行恰好能合并到table的最后一行,但是本身不属于最后一个tr,所以不具有该属性,导致td本身的border-bottom跟table的boder-bottom双重渲染。(好像antd的官网的table并不会出现这个问题,估计是公司在封装table组件的时候出现了问题)

解决方法:

定义一个方法,接收整个list跟当前行的index,通过index截取剩下的list,赋值给newArr数组,for循环newArr数组,判断接下来的元素是否还存在rowSpanNum有值的行信息,如果有,则保持当前td的borderBottom值,如果没有,则当前td的borderBottom为'none'

在column的中运用改方法修改style即可

borderBottomFunc = (List, currentIndex) => {
    let newArr = List.slice(currentIndex+1)
    for(let i=0; i<newArr.length; i++){
      if(newArr[i].rowSpanNum){
        return ''
      }
    }
    return 'none'
}


// 修改column
{
    title: '操作人',
    dataIndex: 'createName',
    width: '80px',
    render: (text, record, index) => {
        const obj = {
            children: isShowPopover(text),
            props: {
              style: {
                  borderBottom: this.borderBottomFunc(List, index)
                }
            },
        };
        if(record.rowSpanNum){
            obj.props.rowSpan = record.rowSpanNum;
        }else{
            obj.props.rowSpan = 0;
        }
        return obj;
    },
},
{
    title: '操作时间',
    dataIndex: 'createTime',
    width: '80px',
    render: (text, record, index) => {
        const obj = {
            children: isShowPopover(text),
            props: {
              style: {
                  borderBottom: this.borderBottomFunc(List, index)
                }
            },
        };
        if(record.rowSpanNum){
            obj.props.rowSpan = record.rowSpanNum;
        }else{
            obj.props.rowSpan = 0;
        }
        return obj;
    },
},
 

效果如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
合并单元格,需要使用 `react-bootstrap-table-next` 中的 `rowSpan` 和 `colSpan` 属性。这些属性可以在 `columns` 对象中定义,用于指定表格中每个单元格应该跨越的行和列的数量。 具体的实现步骤如下: 1. 在 `columns` 对象中定义需要合并单元格的列,为其添加 `rowSpan` 和 `colSpan` 属性。 2. 在 `data` 数组中为需要合并单元格的行添加相应的属性值,这些属性值将在表格渲染时被引用。 下面是一个例子: ```javascript import BootstrapTable from 'react-bootstrap-table-next'; import 'react-bootstrap-table-next/dist/react-bootstrap-table2.min.css'; const columns = [ { dataField: 'id', text: 'ID', }, { dataField: 'name', text: 'Name', }, { dataField: 'age', text: 'Age', }, { dataField: 'gender', text: 'Gender', rowSpan: 2, // 跨越两行 }, { dataField: 'location', text: 'Location', colSpan: 2, // 跨越两列 }, { dataField: 'address', text: 'Address', hidden: true, // 隐藏该列 }, { dataField: 'city', text: 'City', }, { dataField: 'state', text: 'State', }, ]; const data = [ { id: 1, name: 'John', age: 30, gender: 'Male', location: 'New York', address: '123 Main St', city: 'New York', state: 'NY', }, { id: 2, name: 'Jane', age: 25, gender: 'Female', location: 'San Francisco', address: '456 Elm St', city: 'San Francisco', state: 'CA', }, ]; <BootstrapTable keyField='id' data={ data } columns={ columns }/> ``` 在上面的例子中,表格中的 `Gender` 列跨越了两行,`Location` 列跨越了两列。注意,在定义了 `colSpan` 属性的列后面应该添加相应数量的列来占据跨度。 希望这可以帮助你实现合并单元格的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值