【antd + vue】表格行合并,同时使用插槽

一、需求说明

表格中,如果一个学校有多个考试科目,则分行展示,其余列,则合并为一行展示,如图所示

二、需求分析

1、表格行合并

相当于有4行,其中1、2行是同一个学校包含不同考试科目及对应人次的数据,所以除“考试科目、科目人次”列外,其余列数据相同,需要合并成一行;其中3、4行,同理;

ps:即上图所示,分行展示的同一个学校中,“考试科目、科目人次”列如果有多个科目,则分行展示。

2、单元格内容自定义

“序号”列:根据合并行后的序号计算;

“完善性检查”列:需要根据返回结果来判断,单元格的内容及样式;

“操作”列:需要自定义单元格内容;

 三、解决办法

1、html 代码

<a-table
  :rowKey="(record, index) => index"
  :columns="dataList.columns"
  :dataSource="dataList.dataSource"
  :loading="dataList.loading"
  :pagination="false"
  bordered
>
  <!-- “序号”列 -->
  <template v-slot:num="slotProps">
    {{
      (queryParm.pageIndex - 1) * queryParm.pageSize +
      dataList.mergeList.slice(0, slotProps.index).filter(res => {
        return res !== 0;
      }).length +
      1
    }}
  </template>
  <!-- “完备性检测”列 -->
  <template #state="{ record }">
    <span v-if="record.state === '2'" class="safe-level-1">考生照异常</span>
    <span v-else-if="record.state === '1'" class="safe-level-2">正常</span>
    <span v-else class="safe-level-1">考生照片不全</span>
  </template>
  <!-- “操作”列 -->
  <template #action="{ record }">
    <div class="inline look" @click.stop="getDetails(record)">
      <svg-icon icon-class="details" class="icon look"></svg-icon>
      <span class="note">详情</span>
    </div>
  </template>
</a-table>

2、数据 格式


const queryParm= reactive({
      pageIndex: 1,
      pageSize: 10
});

const dataList= reactive({
      dataSource: [],
      columns: [
        {
          title: "序号",
          dataIndex: "num",
          key: "num",
          align: "center",
          width: 100,
          slots: { customRender: "num" },
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "学校名称",
          dataIndex: "schoolName",
          key: "schoolName",
          ellipsis: true,
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "所属区县",
          dataIndex: "cityName",
          key: "cityName",
          ellipsis: true,
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "报名人数",
          dataIndex: "stuNum",
          key: "stuNum",
          ellipsis: true,
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "涉及考点",
          dataIndex: "siteName",
          key: "siteName",
          ellipsis: true,
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "考试科目",
          dataIndex: "subjectName",
          key: "subjectName",
          ellipsis: true
        },
        {
          title: "科目人次",
          dataIndex: "numberOfSubject",
          key: "numberOfSubject",
          ellipsis: true
        },
        {
          title: "上传时间",
          dataIndex: "createTime",
          key: "createTime",
          ellipsis: true,
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "完备性检测",
          dataIndex: "state",
          key: "state",
          ellipsis: true,
          slots: { customRender: "state" },
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        },
        {
          title: "操作",
          dataIndex: "action",
          key: "action",
          width: 100,
          slots: { customRender: "action" },
          customCell: (record, rowIndex) => {
            return {
              style: {
                display: dataList.mergeList[rowIndex] === 0 ? "none" : undefined
              },
              rowSpan: dataList.mergeList[rowIndex]
            };
          }
        }
      ],
      total: 0,
      loading: false,
      mergeList: []
    }
});

 注意事项


 PS:

1、使用 customCell 属性合并行,则不会影响插槽及 customRender 属性的使用;

2、customCell 单元格合并后,需要对被合并行进行样式上的隐藏处理,如下所示:

如果没有在样式上隐藏被合并行,则被合并行会被挤到该行列尾,如下图:

3、rowSpan 属性 支持行合并:

        值为 0 时,该单元格不会渲染(即,被合并);

        值为 1 时,该单元格正常显示(即,1行);

        值为 2 时,该单元格与下一行一起合并展示(即,原2行,现1行展示);

        值为 3 时,该单元格与下两个行一起合并展示(即,原3行,现1行展示);

        以此类推

 3、合并行计算

数据处理代码如下:

/**
 * @description 获取合并单元格rowSpan集合
 * @param {Array} dataScroce 数据源
 * @param {String} filed 需要合并的字段
 * @returns {Array} 该字段下单元格rowSpan集合
 */
const getRowspan = (dataScroce, filed) => {
  let spanArr = [];
  let position = 0;
  dataScroce.forEach((item, index) => {
    if (index === 0) {
      spanArr.push(1);
      position = 0;
    } else {
      //需要合并的地方判断
      if (dataScroce[index][filed] === dataScroce[index - 1][filed]) {
        spanArr[position] += 1;
        spanArr.push(0);
      } else {
        spanArr.push(1);
        position = index;
      }
    }
  });
  return spanArr;
};

得到每行是否需要合并的结果:

dataList.mergeList = getRowspan(dataList.dataSource, "schoolName");

四、参考链接

antd的a-table表格中合并且使用插槽(使用customRender合并出现问题解决方案)_a-table customrender-CSDN博客文章浏览阅读1.5w次,点赞30次,收藏44次。antd的a-table表格中合并且使用插槽1. customRender合并单元格在antd官方文档中,是由使用customRender方式将单元格合并的方法data() { const columns = [ { title: 'Name', dataIndex: 'name', customRender: (text, row, index) => { if (index < 4) { _a-table customrenderhttps://blog.csdn.net/chenyuhang_henry/article/details/118187249?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-118187249-blog-124870111.235%5Ev43%5Epc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.3&utm_relevant_index=7

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建一个基于Vite、Ant Design和Vue 3的项目,你可以按照以下步骤进操作: 1. 首先,你需要安装Vite。你可以通过运以下命令来安装最新版本的Vite: ``` npm init vite@latest my-project cd my-project npm install ``` 这将创建一个新的Vite项目,并安装所有必要的依赖项。 2. 接下来,你需要安装Ant Design Vue。运以下命令来安装Ant Design Vue库: ``` npm install ant-design-vue@next ``` 这将安装最新版本的Ant Design Vue,并将其添加到你的项目中。 3. 配置路由。你可以通过以下步骤来配置Vue Router: - 首先,运以下命令来安装Vue Router: ``` npm install vue-router@next ``` - 在你的项目的src目录下创建一个名为"router"的文件夹。 - 在"router"文件夹中创建一个名为"index.js"的文件,并配置你的路由信息。 - 最后,在项目的"main.js"文件中引入并使用Vue Router。 以上是使用Vite、Ant Design VueVue 3搭建项目的基本步骤。你可以根据需要进一步添加其他功能和组件。祝你搭建项目成功!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3+vite+antd 后台管理系统基础模板](https://download.csdn.net/download/yehaocheng520/87420798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vite + vue3 + Antd 搭建后台管理系统](https://blog.csdn.net/m0_58094704/article/details/127850749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值