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

news/2025/3/26 7:39:18/

先上效果:

 

 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-selectv-model="caseItem.bah"value-key="brid"placeholder="请输入关键词并回车"><el-optionv-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-itemlabel="病人姓名:":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-columnprop="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设为3row.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"borderheight="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.ppmy.cn/news/74215.html

相关文章

react函数组件常用的几个钩子函数

react框架 react框架包括包括两大类&#xff1a;类组件函数组件。 类组件构成&#xff1a;constructor自定义方法。调用方法通过this.方法名()。constructor(superstate)构造器里面必有super字段。render()方法里面写页面布局。 函数组件构成&#xff1a;各种钩子函数return()方…

Android 系统内的守护进程 - main类服务(7) : sdcard

声明 只要是操作系统,不用说的就是其中肯定会运行着一些很多守护进程(daemon)来完成很多杂乱的工作。通过系统中的init.rc文件也可以看出来,其中每个service中就包含着系统后台服务进程。而这些服务被分为:core类服务(adbd/servicemanager/healthd/lmkd/logd/vold)和mai…

在Window10和Window11系统,WPF使用Viewport3D 渲染失败问题解决方案

最近遇到个棘手的问题&#xff1a;在供应商提供的戴尔optiplex 3000的12代处理器主机的集成显卡Intel(R) UHD Graphics 770上使用Viewport3D 渲染失败&#xff08;3D模型显示不了&#xff0c;或者是显示不全&#xff09;&#xff0c;之前开发验证使用的是集成显卡Intel(R) UHD …

【大数据模型】LeonardoAi让心中所想跃然纸上

汝之观览&#xff0c;吾之幸也&#xff01; 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney&#xff0c;都需要注册一个Discord账号&#xff0c;Discord是一个社区软件&#xff0c;在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …

MySQL数据库之存储引擎

一、存储引擎的概念 1.1 什么是存储引擎 MySQL中的数据用各种不下同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存…

Numpy 函数 (一) squeeze(), unsquezze()

1. np.squeeze() syn: np.squeeze(a,axisNone) Notice: 1. a 表示输入的数组 2. axis表示指定需要删除的维度,但是指定的维度必须为单个维度,否则会报错 3. axis 取值可以为None, int, tuple of ints, 或者 axis 为空则表示删除所有单个维度 4.返回值:数组 5. 不会在原来的数组…

Linux内核模块编程

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 1 总体设计思路 Linux内核是单体式结构&#xff0c;相对于微内核结构而言&#xff0c;其运行效率高&#xff0c;但是系统的可维护性和可扩展性较差。为此&#xff0c;Linux提供了内核模块&#xff08;module&#xff09;机制&…

埃尔德动力系统指标公式,衡量趋势的惯性和能量

亚历山大埃尔德(Alexander Elder)在其经典著作《以交易为生》&#xff08;原书第2版&#xff09;新增了一个工具——动力系统(Impulse System)&#xff0c;不过书中只介绍了动力系统的指标以及使用方法&#xff0c;并没有介绍系统的参数。其实动力系统在埃尔德2002年出版的《走…