Antd Vue table合并列表格

2 篇文章 0 订阅

前言:本来想着在网上随便搜个demo借鉴一下,但是找了好几个首页置顶的 发现效果都有点差强人意(好多都是因为相同的数据是相邻的所以才会合并 如果不相邻的话排版直接就废了) 先上效果!

在这里插入图片描述

在网上找的如果这种中间如果穿插有不同的value的话 写的逻辑不生效了,然后开始上代码:

html:

<template>
  <a-table
    :columns="columns"
    :data-source="data"
    bordered
  >
  </a-table>
</template>

主要就是 renderContent 这段逻辑,这段逻辑思想采用了element的合并表格

// 逻辑处理 
const renderContent = (data, key) => {
  var spanArr = [];
  var position = 0;
  data.map((item, index) => {
    if (index === 0) {
      spanArr.push(1);
      position = 0;
    } else {
      if (data[index][key] === data[index - 1][key]) {
        spanArr[position] += 1;
        spanArr.push(0);
      } else {
        spanArr.push(1);
        position = index;
      }
    }
  });
  return spanArr;
};

// 表格数据
const data = [
  {
    key: "1",
    name: "周1 11-29",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
  {
    key: "2",
    name: "周2 11-30",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间221",
    null2: "休息时间2",
  },
  {
    key: "3",
    name: "周3 12-01",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
  {
    key: "4",
    name: "周4 12-02",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
  {
    key: "5",
    name: "周5 12-03",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
  {
    key: "6",
    name: "周6 12-04",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
  {
    key: "7",
    name: "周7 12-05",
    tel1: "语文",
    tel2: "数学",
    tel3: "物理",
    tel4: "化学",
    tel5: "科学",
    tel6: "生物",
    tel7: "英语",
    tel8: "毛概",
    tel9: "思想",
    tel10: "体育",
    null1: "休息时间1",
    null2: "休息时间2",
  },
];

export default {
  data() {
     // 表头数据
    const columns = [
      {
        title: "日期/时间",
        dataIndex: "name",
      },
      {
        title: `08:00 08:45`,
        dataIndex: "tel1",
      },
      {
        title: "09:00 09:45",
        dataIndex: "tel2",
      },
      {
        title: "10:00 10:45",
        dataIndex: "tel3",
      },
      {
        title: "11:00 11:45",
        dataIndex: "tel4",
      },
      {
        title: " ",
        colSpan: 1,
        align: "center",
        dataIndex: "null1",
        // 合并的话  直接把这段复制过去 然后修改一下传值的第一个参数改成你的data源数据, 第二个参数改成你对应的 key 就可以了
        customRender: (value, row, index) => {
          const obj = {
            children: value,
            attrs: {},
          };
          obj.attrs.rowSpan = renderContent(this.data, "null1", index)[index];
          return obj;
        },
      },
      {
        title: "14:00 14:45",
        dataIndex: "tel5",
      },
      {
        title: "15:00 15:45",
        dataIndex: "tel6",
      },
      {
        title: "16:00 16:45",
        dataIndex: "tel7",
      },
      {
        title: " ",
        dataIndex: "null2",
        customRender: (value, row, index) => {
          const obj = {
            children: value,
            attrs: {},
          };
          obj.attrs.rowSpan = renderContent(this.data, "null2", index)[index];
          return obj;
        },
      },
      {
        title: "18:00 18:45",
        dataIndex: "tel8",
      },
      {
        title: "19:00 19:45",
        dataIndex: "tel9",
      },
      {
        title: "20:00 20:45",
        dataIndex: "tel10",
      },
    ];
    return {
      data,
      columns,
    };
  },
};
antd vue table是一个基于Ant Design Vue表格组件,它允许开发者在Vue项目中快速实现美观、功能丰富的数据表格。在使用antd vue table时,如果需要实现单元格内容的拆分,通常有两种方式可以考虑:一种是在数据处理阶段拆分,另一种是在渲染阶段使用插槽自定义单元格内容。 1. 数据处理阶段拆分:在将数据传递给表格组件之前,可以在组件外部对数据进行处理,例如将字符串按照特定规则拆分成数组,然后将这个数组传递给表格组件,让表格组件渲染多个单元格。 2. 渲染阶段使用插槽:antd vue table提供了丰富的插槽功能,允许开发者自定义单元格的内容。你可以使用`scoped slot`来获取表格行和的数据,根据这些数据动态地返回自定义的HTML结构。比如,你可以使用一个插槽将一个单元格拆分为两行显示,或者在单元格内创建多个独立的显示区域。 下面是一个使用插槽来拆分单元格的简单示例代码: ```vue <template> <a-table :columns="columns" :data-source="data"> <!-- 使用插槽自定义单元格内容 --> <template v-slot:customRender="{ text }"> <div class="custom-cell"> <!-- 将单元格内容拆分为多行 --> <span>{{ text.split('|')[0] }}</span> <br> <span>{{ text.split('|')[1] }}</span> </div> </template> </a-table> </template> <script> export default { data() { return { columns: [ { title: '姓名', dataIndex: 'name', key: 'name', customRender: (text) => { return text.split('|')[0]; // 这里仅作为示例拆分 } }, // 其他配置... ], data: [ { key: '1', name: '张三|工程师', // 其他数据... }, // 其他行数据... ] }; } }; </script> <style> /* 自定义样式 */ .custom-cell span { display: block; } </style> ``` 在这个示例中,我们通过`v-slot:customRender`定义了一个插槽,并在插槽中将`text`字符串按照'|'字符拆分为两行显示。这样,每个单元格就被拆分成了两行内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑豆1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值