react结合antd的Table组件实现动态单元格合并

这篇具有很好参考价值的文章主要介绍了react结合antd的Table组件实现动态单元格合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先看一下antd的Table表单组件,合并单元格,用到了rowSpan(合并行)和colSpan(合并列)

antd table合并单元格,react.js,javascript,前端

 后台返回的数据

[
    {
      key: 0,
      category: '水果',
      name: '桃子',
      desc: '好吃',
    },
    {
      key: 1,
      category: '水果',
      name: '梨子',
      desc: '真好吃',
    },
    {
      key: 2,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
    },
    {
      key: 9,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
    },
    {
      key: 3,
      category: '家禽',
      name: '牛肉',
      desc: '太好吃了',
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
    },
  ]

我们希望把category的值相同的,行合并成一个单元格

类似于这种

antd table合并单元格,react.js,javascript,前端

 rowSpan这个属性可以指定合并行。例如说第一行,指定rowSpan为3,意思就是合并三行,则后面紧挨的两行的rowSpan就需要设置为0。因为他们一共就占有3份,第一行的为3份,已经占完了,下面俩就不能再占了,就必须为0

官网实例中,使用onCell属性,来指定合并多少行/列,onCell的值是一个函数,默认接收2个参数,第一个参数是当前行数据,第二个参数就是这行的索引

antd table合并单元格,react.js,javascript,前端

我在网上看了一些大佬的做法,感觉直接处理源数据,在源数据中添加它这个所占的份数,直接通过在onCell中指定他所需要合并的行的个数,这种做法最简单

也就是把源数据处理成这种 

[
    {
      key: 0,
      category: '水果',
      name: '桃子',
      desc: '好吃',
      rowSpan: 2,
    },
    {
      key: 1,
      category: '水果',
      name: '梨子',
      desc: '真好吃',
      rowSpan: 0,
    },
    {
      key: 2,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
      rowSpan: 2,
    },
    {
      key: 9,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
      rowSpan: 0,
    },
    {
      key: 3,
      category: '家禽',
      name: '牛肉',
      desc: '太好吃了',
      rowSpan: 3,
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
      rowSpan: 0,
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
      rowSpan: 0,
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
      rowSpan: 0,
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
      rowSpan: 0,
    },
  ]

具体代码如下文章来源地址https://www.toymoban.com/news/detail-524688.html

import { Table } from 'antd'

const Demo1 = () => {
  let field = 'category'
  const data = [
    {
      key: 0,
      category: '水果',
      name: '桃子',
      desc: '好吃',
      // rowSpan: 2,
    },
    {
      key: 1,
      category: '水果',
      name: '梨子',
      desc: '真好吃',
      // rowSpan: 0,
    },
    {
      key: 2,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
      // rowSpan: 2,
    },
    {
      key: 9,
      category: '蔬菜',
      name: '茄子',
      desc: '真好吃',
      // rowSpan: 0,
    },
    {
      key: 3,
      category: '家禽',
      name: '牛肉',
      desc: '太好吃了',
      // rowSpan: 3,
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
      // rowSpan: 0,
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
      // rowSpan: 0,
    },
    {
      key: 4,
      category: '家禽',
      name: '羊肉',
      desc: '真不错',
      // rowSpan: 0,
    },
    {
      key: 5,
      category: '家禽',
      name: '猪肉',
      desc: '吃不起,太贵',
      // rowSpan: 0,
    },
  ]
  const columns = [
    {
      title: '姓名',
      dataIndex: 'category',
      onCell: (record, index) => {
        // console.log(record.category, record.rowSpan)
        return { rowSpan: record.rowSpan }
      },
    },
    {
      title: '床位',
      // colSpan: 2, // 设置占位2格
      dataIndex: 'parentType',
      /**
       * 每4行都是一个日期,从index = 0 开始,
       * 每隔4行的rowSpan为4,其余的rowSpan为0
       */
      // onCell: (_, index) => ({
      //   rowSpan: index % 2 === 0 || index === 0 ? 2 : 0,
      // }),
    },
    {
      title: '组',
      // colSpan: 0, // 设置占位0格
      dataIndex: 'type',
    },
    {
      title: '药房',
      dataIndex: 'user1',
    },
    {
      title: '类型',
      dataIndex: 'user2',
    },
    {
      title: '项目名称',
      dataIndex: 'user3',
    },
    {
      title: '规格',
      dataIndex: 'user4',
    },
  ]
  const changeData = (data, field) => {
    let count = 0 //重复项的第一项
    let indexCount = 1 //下一项
    while (indexCount < data.length) {
      var item = data.slice(count, count + 1)[0] //获取没有比较的第一个对象
      if (!item.rowSpan) {
        item.rowSpan = 1 //初始化为1
      }
      if (item[field] === data[indexCount][field]) {
        //第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
        item.rowSpan++
        data[indexCount].rowSpan = 0
      } else {
        count = indexCount
      }
      indexCount++
    }
  }
  changeData(data, field) //处理数据

  return (
    <div>
      <Table
        columns={columns}
        dataSource={data}
        pagination={false}
        bordered
      ></Table>
    </div>
  )
}

export default Demo1

到了这里,关于react结合antd的Table组件实现动态单元格合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【react框架】结合antd做表单组件的一些心得记录

    作为一个前端最常遇见的需求场景就是写表单、写表格。写多了会逐渐的积累一些开发心得,此文章根据我使用vue和react的经验记录了一些东西,抛砖引玉的给大家看看。 举例react项目,在做表单的很多时候,我都是从antd上把其中一个form组件例子复制下来,然后再看看提供了

    2024年02月07日
    浏览(81)
  • vue2 - Antd Table组件的头部单元格 字体加粗, 文字内容居中 解决办法:

    问题:默认情况下,英文字体加粗,中文字体不加粗, 在当前.vue的style增加穿透antd table的表头样式,然后在使用table的外层设置加上class 分2种情况,单独设置表头,或者所有单元格都居中 单独设置表头:在设置列时,加上方法:customHeaderCell 所有单元格:在设置第一列时加

    2024年02月15日
    浏览(40)
  • react + antdesign table组件合并行,展开子表格

     假如你有这样的一个数据: 需求如下: 代码实现:  

    2024年03月10日
    浏览(39)
  • react antd动态样式实现

    使用a组件的背景: 想给业务流量加标签,使用动态样式后最终实现如下:  如果不使用动态样式时: 当a组件展示的变量为null或者空时,页面样式如下:  

    2024年02月11日
    浏览(30)
  • React antd upload组件上传视频并实现视频预览

    记录问题:antd的upload组件文档中对于视频的上传预览没有明确的文档demo,在这里记录一下 项目需求:支持图片及视频的上传并实现预览,点击上传后不会立即请求接口上传资源,后续点击确定再上传 上代码

    2024年02月04日
    浏览(31)
  • 【react + antd】antd如何自定义请求使用antd的upload组件实现图片上传且可预览可删除

    官网给出的案例无法使用封装好的请求方式上传图片,以及 无法满足上传图片后获取接口url、名称等信息的的业务需求 。这个时候需要用到customRequest这个api。 但是很遗憾,官网没有给出具体案例。 不过——博主自己试出来了( ̄︶ ̄) 要使用upload,特别重要的属性就是file

    2024年02月17日
    浏览(34)
  • Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法

    记录一下工作时遇到的 el-table 合并单元格的需求,超详细😊 el-table官方提供了合并单元格的方法与返回格式 如下: 根据叙述有了如下思路: 因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两

    2024年02月12日
    浏览(40)
  • React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题

    最近遇到一个React上传组件的问题,即上传附件成功后,文件展示处仍然还有之前上传附件的缓存信息,需要解决的问题是,要把上一次上传的附件缓存在上传成功或者取消后,可以进行清除 经过一顿试错,终于解决了这个问题。 showUploadList,是可选参数,即是否展示upload

    2024年02月04日
    浏览(37)
  • antd-React Table 中文转化

    1.首先需要进行中文包导入 2.引入标签对Table进行包裹即可 3.结果如下 4.成功了,撒花

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包