zoukankan      html  css  js  c++  java
  • layui table表格单元格动态合并,并设置隔行变色

    layui table表格单元格动态合并,并设置隔行变色,此代码只针对嵌套数组只有一层的时候有效,多个数组嵌套还在冥想当中!!

    需求描述

    我们知道在layui插件官方平台有个可以无限极单元格合并的模块,但是其核心理念是针对多个相同数据进行合并,并且也非常好用,数据结构不存在嵌套结构。

    但是偶尔数据也有嵌套的时候,哪怕只有一层数据结构嵌套的话,上面的方法就不好使了,并且我们在不抛弃layui.table的时候照样可以使单元格进行合并,那就请看下图:

     整个代码如下:

    layui.define (function (exports) {
      var $ = layui.jquery,
        mod = {
          render: function (myTable) {
            var tableBox = $ (myTable.elem).next ().children ('.layui-table-box'),
              $main = tableBox
                .children ('.layui-table-body')
                .children ('table')
                .children ('tbody')
                .children ('*[data-index]');
            $main.each (function (pindex) {
              var td = $ (this).children ();
              td.each (function (index) {
                var pp = $ (this).find ('p');
                pp.parents ('td').addClass ('abc');
                if (!pp.parents ('td').siblings ().hasClass ('abc')) {
                  pp.parents ('td').siblings ().attr ('rowspan', pp.length);
                } else {
                  pp.parents ('td').removeAttr ('rowspan');
                }
              });
    
              if ($ (this).find ('td').hasClass ('abc')) {
                var hasAbc = $ (this).find ('.abc'), arr = [], len = 0;
                hasAbc.each (function (im) {
                  var iem = $ (this).find ('p');
                  len = iem.length;
                  iem.each (function (ia, item) {
                    arr.push (item);
                  });
                  $ (this).find ('P:gt(0)').remove ();
                });
                var dataArr = spFn (arr, len);
    
                //生成tr
                dataArr.reverse ().forEach (function (item, index) {
                  if (index != dataArr.length - 1) {
                    var str = '<tr flag=' + pindex + '>';
                    for (var i = 0; i < item.length; i++) {
                      str += "<td align='center'>";
                      str += "<div class='layui-table-cell'>";
                      str += $ (item[i]).html ();
                      str += '</div>';
                      str += '</td>';
                    }
                    str += '</tr>';
    
                    if (td.find ('p').parents ('tr').length > 0) {
                      td.find ('p').parents ('tr').next ().before (str);
                    }
                  }
                });
              }
            });
            var $allmain = tableBox
              .children ('.layui-table-body')
              .children ('table')
              .children ('tbody')
              .children ('tr');
            var findTrBs = function (flag) {
              var className;
              $allmain.each (function () {
                if ($ (this).attr ('data-index') == flag) {
                  className = $ (this).attr ('class');
                }
              });
              return className;
            };
            //单元格合并以后 设置隔行变色
            $allmain.each (function (i) {
              if ($ (this).attr ('data-index')) {
                if ($ (this).attr ('data-index') % 2 == 0) {
                  $ (this).addClass ('even');
                } else {
                  $ (this).addClass ('odd');
                }
              } else {
                $ (this).addClass (findTrBs ($ (this).attr ('flag')));
              }
            });
          },
        };
      
      exports ('tableMerge', mod);
    });

    具体思路:

    1、首先我们需要先把table表格数据字段设置成template

    2、在页面上设置模板
    <script type="text/html" id="nownr">
        {{# layui.each(d.corrNowConArr,function(index,item){ }}
          <p>{{item.con}}</p>
        {{# });}}
      </script>
    3、通过特殊元素标记将此数据追加到对应tr的下面,此过程我们需要做一些转换
    //将数组分割成 几个几个组合的多维数组
      //[1,2,3,4] 组合成[[1,2],[3,4]]
      function spFn (arr, len) {
        const arr1 = arr.reduce ((init, item, index) => {
          index % len === 0
            ? init.push ([item])
            : init[init.length - 1].push (item);
          return init;
        }, []);
        return senFun (arr1);
      }

    4、将遍历好的元素标记按照 纵向排列

    //数组竖向排列
      //[[1,2],[3,4]] 组合成[[1,3],[2,4]]
      function senFun (data) {
        let final = [];
        let length = Math.min (...data.map (arr => arr.length));
        for (let i = 0; i < length; i++) {
          let tmp = [];
          for (let j = 0; j < data.length; j++) {
            tmp.push (data[j][i]);
          }
          final.push (tmp);
        }
        return final;
      }

    最终渲染结构如图:

    切记:此案例不支持多项嵌套 !写的不好还请见谅。如有问题可以咨询我qq:2481494428

    下面奉上支持多层单元格合并的链接:https://fly.layui.com/extend/tableMerge/



  • 相关阅读:
    Linux套接子(c语言)模拟http请求、应答
    709. 转换成小写字母
    1108. IP 地址无效化
    C++大作业——教职工管理系统
    贪吃蛇游戏 1.0
    getch()函数的使用方法及其返回值问题
    Open source project code
    slack Interface operation
    slack init: Simple interaction with slack bot
    mac 使用 Docker 搭建 ubuntu 环境
  • 原文地址:https://www.cnblogs.com/nianzhilian/p/12403055.html
Copyright © 2011-2022 走看看