使用elementUI构建复杂表格,合并行或列,多级表头等

简介: 前端开发过程中常常会遇到各种开发表格的场景,有时候有的表格比较简单有的比较复杂(如下图简单示例所示,有合并项和多级表头),Elementui的el-table控件也可以支持构建复杂的表格,本文将指导你如何快速开发复杂表格~~~

 项目场景:

       前端开发过程中常常会遇到各种开发表格的场景,有时候有的表格比较简单有的比较复杂(如下图简单示例所示,有合并项和多级表头),Elementui的el-table控件也可以支持构建复杂的表格,本文将指导你如何快速开发复杂表格~~~

image.gif编辑


问题描述及解决方案

1、多级表头

数据结构比较复杂的时候,可使用多级表头来展现数据的层次关系。

只需要在 el-table-column 里面嵌套 el-table-column,就可以实现多级表头。

image.gif编辑

<template>
        <div class="tableWrap">
      <el-table
        id="resultTableProject"
        :data="tableData"
        border
        v-loading="loading"
        element-loading-text="数据查询中"
        :span-method="spanMethod"
        height="620"
        size='small'
      >
        <el-table-column
          label="项目编号"
          prop="id"
          wdth="160"
          align="center"
        />
        <el-table-column
          label="项目名称"
          prop="casename"
          align="center"
        />
          <el-table-column
          label="部门"
          prop="bm"
          align="center"
        />
        <el-table-column
          label="部门人员(产值)"
          align="center"          
        >
          <el-table-column
            v-for="(item, index) in userData"
            :key="index"
            :label="item.name"
            :prop="item.name + 'cz'"
            width="200"
            align="center"
          />
        </el-table-column>
      </el-table>
    </div>
</template>
<script  setup>
import { ref, onMounted,onBeforeMount, watch, reactive ,toRefs,toRaw,shallowRef} from "vue";
let tableData=ref([
  {  id:202112312,casename:'小家电项目',bm:"制造一队",'张三cz':100,},
  {  id:202112342,casename:'小家电项目',bm:"制造二队",'李四cz':200,},
  {  id:202112343,casename:'电视机',bm:"制造三队",'王五cz':300},
  {  id:202112344,casename:'电视机',bm:"制造三队",'王五cz':300,},
  {  id:202112345,casename:'空调项目',bm:"制造四队",'孙七cz':300},
  {  id:202112346,casename:'冰箱项目',bm:"制造四队",'孙七cz':300},
])
let userData=ref([
    {
        name:'张三',
    },
      {
        name:'李四',
    },
    {
        name:'王五',
    },
    {
        name:'孙七',
    }
])
</script>

image.gif

2、合并行或列

通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspancolspan的对象。

image.gif编辑

<template>
        <div class="tableWrap">
      <el-table
        id="resultTableProject"
        :data="tableData"
        border
        v-loading="loading"
        element-loading-text="数据查询中"
        :span-method="spanMethod"
        height="620"
        size='small'
      >
        <el-table-column
          label="项目编号"
          prop="id"
          wdth="160"
          align="center"
        />
        <el-table-column
          label="项目名称"
          prop="casename"
          align="center"
        />
          <el-table-column
          label="部门"
          prop="bm"
          align="center"
        />
        <el-table-column
          label="部门人员(产值)"
          align="center"          
        >
          <el-table-column
            v-for="(item, index) in userData"
            :key="index"
            :label="item.name"
            :prop="item.name + 'cz'"
            width="200"
            align="center"
          />
        </el-table-column>
      </el-table>
    </div>
</template>
<script  setup>
import { ref, onMounted,onBeforeMount, watch, reactive ,toRefs,toRaw,shallowRef} from "vue";
let tableData=ref([
  {  id:202112312,casename:'小家电项目',bm:"制造一队",'张三cz':100,},
  {  id:202112342,casename:'小家电项目',bm:"制造二队",'李四cz':200,},
  {  id:202112343,casename:'电视机',bm:"制造三队",'王五cz':300},
  {  id:202112344,casename:'电视机',bm:"制造三队",'王五cz':300,},
  {  id:202112345,casename:'空调项目',bm:"制造四队",'孙七cz':300},
  {  id:202112346,casename:'冰箱项目',bm:"制造四队",'孙七cz':300},
])
let userData=ref([
    {
        name:'张三',
    },
      {
        name:'李四',
    },
    {
        name:'王五',
    },
    {
        name:'孙七',
    }
])
const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
  // 如果当前列不是组织机构列,则返回 { rowspan: 1, colspan: 1 },表示该单元格不需要合并
  // if (columnIndex !== 0 && columnIndex !== 1&& columnIndex !== 2  &&columnIndex!==9&&columnIndex!==10) {
  //   return { rowspan: 1, colspan: 1 };
  // }
    if (columnIndex !== 0 && columnIndex !== 1) {
    return { rowspan: 1, colspan: 1 };
  }
  // 如果当前行是该组织机构的第一行,则计算该组织机构的行数,并返回 { rowspan, colspan: 1 },表示需要合并的行数为 rowspan
  if (
    rowIndex === 0 ||
    row.casename !== tableData.value[rowIndex - 1].casename
  ) {
    const rowCount = tableData.value.filter(
      (i) => i.casename === row.casename
    ).length;
    return { rowspan: rowCount, colspan: 1 };
  }
  // 否则返回 { rowspan: 0, colspan: 0 },表示该单元格已被上方单元格合并
  return { rowspan: 0, colspan: 0 };
};
</script>
<style lang="less" scoped>
.tableQualityProject {
  height: 100vh;
  width: 100%;
  overflow: auto;
  background-image: #f2f2f2;
  h1 {}
}
  .tableWrap {
    padding: 0 20px;
    //  width: 100%;
    // margin: 0 auto;
    /deep/ .el-table__header th {
      background-color: #409eff!important ; /* 设置表头颜色 */    
     color: #fff; /* 设置表头文字颜色 */
    //  background-color:#FAFAFA;
    //  color:#252525;
     border:1px solid f5f5f5;
    }
    /deep/ .el-table .cell {
      // font-weight: 700;
      font-size: 16px;
      padding: 0;
    }
    .gzlWrap {
      // border-bottom:1px solid #dfdfdf;
      &:last-child {
        border-bottom: none;
      }
      span {
        display: inline-block;
        padding: 5px 0;
      }
      .key {
        width: 60%;
      }
      .value {
        width: 40%;
      }
    }
    .selfTableHead {
      display: flex;
      span {
        display: inline-block;
        width: 60px;
      }
    }
  }
</style>

image.gif

3、自定义表头颜色

image.gif编辑

image.gif编辑

最简单的:修改表头样式即可

.tableWrap {
    padding: 0 20px;
    //  width: 100%;
    // margin: 0 auto;
    /deep/ .el-table__header th {
      background-color: #409eff!important ; /* 设置表头颜色 */    
     color: #fff; /* 设置表头文字颜色 */
    //  background-color:#FAFAFA;
    //  color:#252525;
     border:1px solid f5f5f5;
    }
    /deep/ .el-table .cell {
      // font-weight: 700;
      font-size: 16px;
      padding: 0;
    }
    .gzlWrap {
      // border-bottom:1px solid #dfdfdf;
      &:last-child {
        border-bottom: none;
      }
      span {
        display: inline-block;
        padding: 5px 0;
      }
      .key {
        width: 60%;
      }
      .value {
        width: 40%;
      }
    }
    .selfTableHead {
      display: flex;
      span {
        display: inline-block;
        width: 60px;
      }
    }
  }

image.gif


目录
相关文章
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
9778 1
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
JavaScript API
Vue使用vue-3d-model组件预览3D三维文件、立体文件,支持旋转、自动播放
Vue使用vue-3d-model组件预览3D三维文件、立体文件,支持旋转、自动播放
|
关系型数据库 MySQL 数据库
Element el-date-picker 日期选择器详解
本文目录 1. 前言 2. 基本用法 3. 日期格式化 4. 选择其他日期单位 5. 选择多个日期 6. 带快捷选项 7. 禁用部分日期 8. 小结
6086 0
Element el-date-picker 日期选择器详解
|
8月前
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
403 13
Element-ui 表格 (Table) 组件中动态合并单元格
Element-ui 表格 (Table) 组件中动态合并单元格
1640 0
Element-ui 表格 (Table) 组件中动态合并单元格
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
4509 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
7402 0
|
JavaScript 测试技术 API
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
如何从 Vue 2 无痛升级到 Vue 3,一文搞定!
10633 8
|
JSON JavaScript 定位技术
Echarts 绘制地图(中国、省市、区县),保姆级教程!
Echarts 绘制地图(中国、省市、区县),保姆级教程!