Vue3+Ts+Element-Plus多级表头以及动态合并单元格

Vue3+Ts+element-PLUS 多级表头以及动态合并单元格

先看效果:

  1. 首先得话可以先去官网把多级表头拿过来改一下
html 复制代码
<el-table
  stripe
  border
  :maxHeight="windowHeight - 385"
  :data="tableData"
  style="width: 100%"
  :span-method="objectSpanMethod"
>
  <el-table-column align="center" prop="demo" label="demo" />
  <el-table-column width="200" prop="demo1" label="demo1" show-overflow-tooltip>
  </el-table-column>
  <el-table-column align="center" label="学习需求">
    <el-table-column align="center" :prop="`xuexixuqiu`" label="不感兴趣">
      <template #default="{ row }">
        <span v-if="!row.xuexixuqiu">
          <el-icon size="20" color="red">
            <CircleCloseFilled />
          </el-icon>
        </span>
      </template>
    </el-table-column>
    <el-table-column align="center" :prop="`xuexixuqiu`" label="感兴趣">
      <template #default="{ row }">
        <span v-if="row.xuexixuqiu">
          <el-icon size="20" color="green">
            <SuccessFilled />
          </el-icon>
        </span>
      </template>
    </el-table-column>
  </el-table-column>
  <el-table-column align="center" label="你好">
    <el-table-column align="center" prop="qianming1" label="1签名" />
    <el-table-column align="center" prop="qianming2" label="2签名" />
  </el-table-column>
  <el-table-column align="center" label="再见">
    <el-table-column align="center" prop="zaijian1" label="再见1" width="120" />
    <el-table-column align="center" prop="zaijian2" label="再见2" width="120" />
    <el-table-column align="center" prop="zaijian3" label="再见3" />
    <el-table-column align="center" prop="zaijian4" label="再见4" width="120" />
  </el-table-column>
</el-table>
  1. 合并引用方式
ts 复制代码
import { getRowSpanMethod } from "./hooks";
const objectSpanMethod = computed(() => {
  return getRowSpanMethod(props.tableData, ["demo"]);
});
  1. ts 部分
ts 复制代码
/**
 * 合并相同数据,导出合并列所需的方法(只适合el-table)
 * @param {Object} data
 * @param {Object} rowSpanArray
 */
export function getRowSpanMethod(data: any, rowSpanArray: any) {
  /**
   * 要合并列的数据
   */
  const rowSpanNumObject: any = {};

  //初始化 rowSpanNumObject
  rowSpanArray.map((item: any) => {
    rowSpanNumObject[item] = new Array(data.length).fill(1, 0, 1).fill(0, 1);
    rowSpanNumObject[`${item}-index`] = 0;
  });
  //计算相关的合并信息
  for (let i = 1; i < data.length; i++) {
    rowSpanArray.map((key: any) => {
      const index = rowSpanNumObject[`${key}-index`];
      if (data[i][key] === data[i - 1][key]) {
        rowSpanNumObject[key][index]++;
      } else {
        rowSpanNumObject[`${key}-index`] = i;
        rowSpanNumObject[key][i] = 1;
      }
    });
  }

  //提供合并的方法并导出
  // @ts-ignore
  const spanMethod = function ({ row, column, rowIndex, columnIndex }) {
    if (rowSpanArray.includes(column["property"])) {
      const rowspan = rowSpanNumObject[column["property"]][rowIndex];
      if (rowspan > 0) {
        return { rowspan: rowspan, colspan: 1 };
      }
      return { rowspan: 0, colspan: 0 };
    }
    return { rowspan: 1, colspan: 1 };
  };

  return spanMethod;
}

4.数据结构

ts 复制代码
const tableData: User[] = [
  {
    demo: "项目1",
    demo1: "数据1111111111",
    xuexixuqiu: false,
    qianming1: "wang",
    qianming2: "fang",
    zaijian1: "A",
    zaijian2: "好,太好了",
    zaijian3: "再见3",
    zaijian4: "再见4",
  },
  {
    demo: "项目1",
    demo1: "数据1111111111",
    xuexixuqiu: false,
    qianming1: "wang",
    qianming2: "fang",
    zaijian1: "A",
    zaijian2: "好,太好了",
    zaijian3: "再见3",
    zaijian4: "再见4",
  },

  {
    demo: "项目2",
    demo1: "数据1111111111",
    xuexixuqiu: false,
    qianming1: "wang",
    qianming2: "fang",
    zaijian1: "A",
    zaijian2: "好,太好了",
    zaijian3: "再见3",
    zaijian4: "再见4",
  },

  {
    demo: "项目2",
    demo1: "数据1111111111",
    xuexixuqiu: false,
    qianming1: "wang",
    qianming2: "fang",
    zaijian1: "A",
    zaijian2: "好,太好了",
    zaijian3: "再见3",
    zaijian4: "再见4",
  },

  {
    demo: "项目2",
    demo1: "数据1111111111",
    xuexixuqiu: false,
    qianming1: "wang",
    qianming2: "fang",
    zaijian1: "A",
    zaijian2: "好,太好了",
    zaijian3: "再见3",
    zaijian4: "再见4",
  },
];
相关推荐
TeleostNaCl1 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫3 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友3 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理5 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻5 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front6 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰6 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼987 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮7 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20027 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员