layui作为一款现在非常流行的UI框架,相信很多的小伙伴们都用过吧。其中的数据表格在前端调用中,更是节省了不少重复书写获取设置接口数据的时间,但是有些情况单靠官方的档案还是无法满足我们的工作需求的,如何并单元格一类的操作,官方档案中只有表头合并的操作文档,但是我们遇到更多的是表格内部的合并,今天文汇软件小编就来为大家分享下这方面的心得。
如下图所示:
这是一份病人的手术用药单,大部分的病人取药可能到要好几种,但是如果用官方文档他原来的数据表格就会像下图。即使是相同的病人也会用很多不同条数的信息,病人的信息很多在浏览时很不方便。
小编说实话一开始也很懵,后来在网上找到了关于layui的高手。他的大体思路应该是:这个应该先是获取td中所有的数量,然后获取每个td的值,然后再获取下个tr中相同位置的td值如果值相同,时期合并并获取父级tr的高度,同时除了他之外的其他td都隐藏,代码如下:
layui.use('table', function(){
var table = layui.table;
table.reload('test2', {
url: '',//你的接口
done: function(res, curr, count){
console.log(res);
layuiRowspan(['fname','PATIENT_NAME','PATIENT_MRN','PATIENT_SEX','age'],1);
layuiRowspan(res.data,1);//支持数组
layuiRowspan(count,1,true);
}
});
});
}
var execRowspan = function(fieldName,index,flag){
// 1为不冻结的情况,左侧列为冻结的情况
let fixedNode = index=="1"?$(".layui-table-body")[index - 1]:(index=="3"?$(".layui-table-fixed-r"):$(".layui-table-fixed-l"));
// 左侧导航栏不冻结的情况
let child = $(fixedNode).find("td");
let childFilterArr = [];
// 获取data-field属性为fieldName的td
for(let i = 0; i < child.length; i++){
if(child[i].getAttribute("data-field") == fieldName){
childFilterArr.push(child[i]);
}
}
// 获取td的个数和种类
let childFilterTextObj = {};
for(let i = 0; i < childFilterArr.length; i++){
let childText = flag?childFilterArr[i].innerHTML:childFilterArr[i].textContent;
if(childFilterTextObj[childText] == undefined){
childFilterTextObj[childText] = 1;
}else{
let num = childFilterTextObj[childText];
childFilterTextObj[childText] = num*1 + 1;
}
}
let canRowspan = true;
let maxNum;//以前列单元格为基础获取的最大合并数
let finalNextIndex;//获取其下第一个不合并单元格的index
let finalNextKey;//获取其下第一个不合并单元格的值
for(let i = 0; i < childFilterArr.length; i++){
(maxNum>9000||!maxNum)&&(maxNum = $(childFilterArr[i]).prev().attr("rowspan")&&fieldName!="8"?$(childFilterArr[i]).prev().attr("rowspan"):9999);
let key = flag?childFilterArr[i].innerHTML:childFilterArr[i].textContent;//获取下一个单元格的值
let nextIndex = i+1;
let tdNum = childFilterTextObj[key];
let curNum = maxNum if(canRowspan){ for(let j =1;j<=curNum&&(i+j finalNextKey = flag?childFilterArr[i+j].innerHTML:childFilterArr[i+j].textContent; finalNextIndex = i+j; if((key!=finalNextKey&&curNum>1)||maxNum == j){ canRowspan = true; curNum = j; break; } j++; if((i+j)==childFilterArr.length){ finalNextKey=undefined; finalNextIndex=i+j; break; } } childFilterArr[i].setAttribute("rowspan",curNum); if($(childFilterArr[i]).find("div.rowspan").length>0){//设置td内的div.rowspan高度适应合并后的高度 $(childFilterArr[i]).find("div.rowspan").parent("div.layui-table-cell").addClass("rowspanParent"); $(childFilterArr[i]).find("div.layui-table-cell")[0].style.height= curNum*38-10 +"px"; } canRowspan = false; }else{ childFilterArr[i].style.display = "none"; } if(--childFilterTextObj[key]==0|--maxNum==0|--curNum==0|(finalNextKey!=undefined&&nextIndex==finalNextIndex)){//||(finalNextKey!=undefined&&key!=finalNextKey) canRowspan = true; } } } //合并数据表格行 var layuiRowspan = function(fieldNameTmp,index,flag){ let fieldName = []; console.log(fieldNameTmp,index,flag); if(typeof fieldNameTmp == "string"){ fieldName.push(fieldNameTmp); }else{ fieldName = fieldName.concat(fieldNameTmp); } for(let i = 0;i execRowspan(fieldName[i],index,flag); } } 结果如下图所示: 这里只需要在数据表格渲染的时候改成自己的东西即可,其他的内容说实话有些复杂,有能开发出更多用法的小伙伴欢迎联系文汇软件小编,小编在这里等你哦♥♥♥