elementUI,自定义表头,多层级表头,表头合并,行内容一致的合并行

news2025/3/1 5:00:25

先上效果:

 

 1.自定义表头:

通过设置 slot="header" 来自定义表头。 slot-scope="scope" 这一行千万不要因为没有再template中使用到scope,vscode报红而删除,这会导致input框不能输入任何内容!  

<template slot="header" slot-scope="scope">//slot-scope="scope" 千万不要因为vscode报红删除
  <el-row :gutter="2">
    <el-col :span="12">
      <el-form-item
        :label="`病案号${caseIndex + 1}:`"
        :prop="`data.${0}.patientList.${caseIndex}.bah`"
        :rules="tableRuleForm.bah"
      >
        <el-select
          v-model="caseItem.bah"
          value-key="brid"
          placeholder="请输入关键词并回车"
        >
          <el-option
            v-for="item in medicalOptions"
            :key="item.brid"
            :label="item.bah"
            :value="item"
          >
            <span>{{ item.brxm }}:{{ item.bah }}</span>
          </el-option>
        </el-select>
      </el-form-item>
    </el-col>
    <el-col :span="12">
      <el-form-item
        label="病人姓名:"
        :prop="`data.${0}.patientList.${caseIndex}.brxm`"
        :rules="tableRuleForm.brxm"
      >
        <el-input
          @change="$forceUpdate()"
          v-model="caseItem.brxm"
          size="mini"
          placeholder="请输入病人姓名"
        />
      </el-form-item>
    </el-col>
  </el-row>
</template>

2.多级表头和表头合并:

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

<el-table-column
  prop="amount1"
  v-for="(caseItem, caseIndex) in tableData.data[0].patientList"
  :key="caseIndex"
>
  <el-table-column prop="amount1" label="完全符合">
    <el-table-column prop="amount1" align="center" width="80">
    </el-table-column>
  </el-table-column>
  <el-table-column prop="amount1" label="部分符合"
    ><el-table-column prop="amount1" align="center" width="80">
    </el-table-column>
  </el-table-column>
</el-table-column>

因为下边还有要操作的单元格,所以总符合率这里必须要将三列合并为一列。所以我们要找到需要合并的单元格位置,使用 .colSpan 属性来合并单元格,这里循环是因为table的列是动态添加的所以进行循环合并,如果是固定的列,就不需要循环,直接找到要合并的列就行了。setColSpan方法一定要等table的dom全部渲染完成了才可以调用!否则获取不到节点。我这里是放在mounted()函数中并设置了一个setTimeout用了300毫秒的延时调用。

// 合并表头
setColSpan() {
  // 获取第三行的多级表头
  let row = document
    .getElementsByClassName("is-group")[0]
    .getElementsByTagName("tr")[2];
  // console.log(row); //这里获取的表头排除了序号,检查项目,检查内容
  // 获取每一列
  let colAll = row.getElementsByTagName("th");
  // 循环列, .length -3 是减去序号,检查项目,检查内容这三列
  for (let index = 0; index < colAll.length - 3; index++) {
    if (index % 6 == 0) {
      // 只要当前列模以6是0就将本列加3(找到 不适用 下的这一列)的单元格的colSpan设为3
      row.getElementsByTagName("th")[index + 3].colSpan = 3;
      // 把接下来的两行设置为none 防止挤后边的
      row.getElementsByTagName("th")[index + 4].style.display = "none";
      row.getElementsByTagName("th")[index + 5].style.display = "none";
    }
  }
},

 3.行内容一致的跨行合并:

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

<el-table
  :data="tableData.data"
  :span-method="objectSpanMethod"
  border
  height="calc(100vh - 280px)"
  style="width: 100%"
  class="table"
  >
</el-table>

 下边是方法

// 合并行
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  const dataProvider = this.tableData.data;
  if (columnIndex === 1) {
    const prevRow = dataProvider[rowIndex - 1]; //上一条数据
    let nextRow = dataProvider[rowIndex + 1]; //下一条数据
    // 如果上一条数据存在并且上一条数据和当前数据相同,那么就不渲染这个单元格
    if (prevRow && prevRow.BZMC === row.BZMC) {
      return { rowspan: 0, colspan: 0 };
      //不相同判断如何渲染
    } else {
      let rowspan = 1;
      // 如果下一条数据和当前数据相同那么应该合并单元格 while判断下边有几行和当前数据相同,while直到找到不相同的退出循环
      while (nextRow && nextRow.BZMC === row.BZMC) {
        rowspan++;
        // 只要当前行和下一行相同,那么对比rowspan加下一条数据是否相同
        nextRow = dataProvider[rowspan + rowIndex];
      }
      if (rowspan > 1) {
        return { rowspan, colspan: 1 };
      }
    }
  }
},

这里用while循环来判断到底进行多少次跨行合并。

4.table动态新增列的时候表格中间出现一大片空白,样式错乱

因为我这个table的列是动态新增的,在病案历数select框中我多选择一例就会新增病案号,病人姓名这几列。所以病案号是一个数组循环出来的列,我新增的时候push进去一个病人信息对象,table重新被渲染。渲染的时候table会闪一下然后出现一大片空白,如图:

具体原因不知道为什么,但是我猜测是因为我直接对渲染的table :data="tableData" 进行了操作导致的,所以我的解决方法是先拷贝一份当前渲染的tableData,操作拷贝的这个对象,最后先将tableData赋空,再把拷贝的对象赋值给tableData,这样就完美解决了。

changeCaseNum(value) {
  //深拷贝一份当前正在渲染的tableData进行操作
  let data = JSON.parse(JSON.stringify(this.tableData.data));
  if (data[0].patientList.length < value) {
    while (data[0].patientList.length < value) {
      data.forEach((item) => {
        item.patientList.push({
          fz: "100.00",
          bah: "",
          brxm: "",
          df: "0",
          wqfhs: data.length,
          bffhs: 0,
          bfhs: 0,
        });
      });
    }
  } else {
    data.forEach((item) => {
      item.patientList.splice(value);
    });
  }
  //先将当前渲染的talbeData 赋空
  this.tableData.data = [];
  //然后再将拷贝的data赋值给el-talbe渲染
  setTimeout(() => {
    this.tableData.data = data;
  });
  // 重新调用合并表头的方法
  setTimeout(() => {
    this.setColSpan();
  }, 300);
},

记得操作完table之后要重新调用 setColSpan()进行表头合并。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考网工计算题总结(一):总共27类题型,进来复习啦!

题型一&#xff1a; 1.地址编号从80000H到BFFFFH且按字节编址的内存容量为&#xff08;5&#xff09;KB,若用16KX4bit的存储芯片够成该内存&#xff0c;共需&#xff08;6&#xff09;片。 (5)A.128 B.256 C.512 D.1024 (6)A.8 B.16 C.32 D.64 【答案】B C 【解析】本题…

写一个自己的MyGPT app

chatGPT大火之后&#xff0c;国内外一众玩家撸起袖子热火朝天干了起来。 借助开源的GPT可以轻松的拥有自己的专属GPT&#xff0c;装装逼还是很好用的&#xff0c;也算赶一下chatGPT的风口。 这里使用ANYGPT&#xff0c;打造自已的GPT&#xff0c;AnyGPT API 开发者文档 语雀…

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出 概述窗口看门狗 (WWDG)WWDG_SR 状态寄存器WWDG 配置与使用使用 WWDG 进行故障检测案例 概述 在嵌入式开发中, 可靠性和稳定性是至关重要的. 这就是为什么许多单片机, 比如 STM32, 提供了窗口看门狗 (Window Watchdog, WW…

redis 源码记录

正好最近时间富裕&#xff0c;看一看redis源码&#xff0c;简单的记录一下。也有可能说的是不全面的&#xff0c;自行斟酌&#xff0c;只能通过debug来简单的梳理本次测试流程&#xff0c;而不是全量的覆盖的所有测试用例&#xff0c;时不时更新&#xff0c;争取一天学一点点。…

基于Web的水果蔬菜销售系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网经济与技术进程的不断推进&#xff0c;网上购物方式受到公众的普遍关注和欢迎。传统的樱桃线下销售模式缺陷不断暴露&#xff0c;难以满足公众不断加快的生活节奏和生活方式的需求。本文根据目前大众的实际需要&#xff0c;根据网上商城的特点、现状以及主要功…

Java 与排序算法(3):插入排序

一、插入排序 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将待排序序列分为已排序区间和未排序区间&#xff0c;然后每次从未排序区间取出一个元素&#xff0c;将其插入到已排序区间的合适位置中&#xff0c;使得插入…

【SpringBoot】八:Web服务---WebMvcConfigurer

文章目录 1.WebMvcConfigurer简介2. 页面跳转控制器3. 数据格式化4. 拦截器4.1 一个拦截器4.2 多个拦截器 1.WebMvcConfigurer简介 WebMvcConfigurer是SpringMVC xml配置文件的JavaConfig实现方式。 2. 页面跳转控制器 创建 SpringMVC 配置类: 3. 数据格式化 Formatter&…

计算机组成原理-存储系统-主存储器(芯片)和CPU连接

目录 一、SRAM和DRAM芯片 DRAM&#xff1a;栅极电容存储信息 SRAM&#xff1a;双稳态触发器存储信息 区别​编辑 二、ROM芯片 三、主存于CPU的连接 位扩展法 字扩展法 字位同时扩展法 译码器 四、双端口RAM和多模块存储器 4.1双端口RAM 4.2多模块存储器 4.2.1单体多字…

pthread多线程: 创建最简单的线程

文章目录 1. 目的1.1 不使用 Pthread 的情况1.2 使用 Pthread 的情况1.3 使用 Pthread 的好处 2. Pthread 创建线程的 API2.1 环境2.2 pthread_create()2.3pthread_join() 3. 创建最简单的线程3.1 要点3.2 代码 4. 创建多个子线程4.1 要点4.2 代码 5. 总结 1. 目的 Pthread 提…

计算机组成原理-存储系统-基本概论及组成

目录 一、存储器的层次化结构 二、存储器分类 存储介质 存取方式 信息可改性 三、性能指标 四、主存储器基本组成 基本的的半导体元件及原理 存储芯片的基本原理 一、存储器的层次化结构 二、存储器分类 存储介质 半导体存储器(主存&#xff0c;cache)、磁表面存储器(…

基于SpringBoot的SSMP的整合案例

基于SpringBoot的SSMP的整合案例 简单介绍模块创建创建实体类导入Mybatis-plus和druid的配置文件使用junit测试查询方法MP分页查询按照条件进行查询业务层Service开发业务层Service快速开发表现层开发表现层 实现分页查询表现层消息一致性的处理查询所有书本信息添加书本删除操…

TensorFlow巨浪中的巨人:大数据领域的引领者 TensorFlow实战【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。欢迎订阅本专栏&#xff01; 大数据时代的到来带来了海量数据的处理和分析需求。在这个背景下&#xff0c;TensorFlow作为一种强大的深度学习框架&#xff0c;展现了其在大数据领域…

fastreport使用教程(fastreport报表编辑器)

除了库本身&#xff0c;FastReport.Net还包括单独的程序 – Designer和Viewer。 如您所知&#xff0c;第一个用于创建和编辑报表模板。它具有报表预览模式&#xff0c;您可以从中查看报表&#xff0c;将其导出为所需的数据格式并将其发送到打印。 Viewer用于以fpx预览格式查看报…

清华p-tuning | GPT也能做NLU?清华推出p-tuning方法解决GPT系列模型fine-tuning效果比BERT差问题

一、概述 title&#xff1a;GPT Understands, Too 论文地址&#xff1a;https://arxiv.org/abs/2103.10385 代码&#xff1a;https://github.com/THUDM/P-tuning 1.1 Motivation GPTs模型利用传统的fine-tuning技术在NLU任务上效果比较差&#xff0c;比同等量级的BERT效果…

2023/5/22总结

继承 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法。 如图&#xff1a; 在上面的图片中&#xff0c;dog和cat都继承了Animal类&#xff0c;所以dog和cat都可以称为Animal的子类或者派生类&…

chatgpt赋能Python-python_dng

Python DNG&#xff1a;开启更高效的数据处理之路 什么是Python DNG&#xff1f; Python DNG&#xff08;Data NumPy Generator&#xff09;是一种基于Python的高效数据生成器&#xff0c;可以加速数据处理和分析的过程。它基于Numpy数组操作和并行计算思想&#xff0c;可以快…

C++详解NOI题:[NOIP2021] 报数

文章目录 前言一、题目二、暴力解题步骤&#xff08;50分&#xff09;三、打表防坑解题&#xff08;100分&#xff09;总结 前言 受不了CSDN每日一练的在线竞赛系统了&#xff0c;bug多就算了&#xff0c;勉强能用&#xff0c;可那些题目的神描述&#xff0c;到处是错。所以找…

前端面试知识点总结

前言&#xff1a; 博主突击两个月八股拿到美团&#xff08;基础研发&#xff09;&#xff0c;腾讯&#xff08;IEG&#xff09;&#xff0c;百度&#xff08;搜索部门&#xff09;暑期实习offer call&#xff0c;这是我学习过程中整理的前端知识点&#xff0c;内容有些多&#…

【13900k】i9 核显升级驱动

这里写自定义目录标题 官方的助手不能用显卡控制中心提示最新的更新搜索显卡 intel uhd graphics 770 手动下载安装自定义音频为啥也要卸载&#xff1f;新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片…

网络编程——嵌入式(驱动)软开基础(六)

1、简述TCP三次握手的过程。 (1)第一次握手:客户端创建传输控制块,然后向服务器发出连接请求报文(将标志位SYN置1,随机产生一个序列号seq=x),接着进入SYN-SENT状态。 (2)第二次握手:服务器收到请求报文后由SYN=1得到客户端请求建立连接,回复一个确认报文(将标志…