云迈博客

您现在的位置是:首页 > 前端技术 > 正文

前端技术

layui 数据表格的复选按钮如果根据分页切换存储选中效果

suqin2021-03-28前端技术524
需要实现的效果:用户使用表格切换分页,多选框记录用户选中的数据,当用户返回回来后,选中效果仍然可见。难点:layui的表格是自动渲染的,表格是通过一个统一的数据格式放入进去的,放什么数据,显示的就

需要实现的效果:
用户使用表格切换分页,多选框记录用户选中的数据,当用户返回回来后,选中效果仍然可见。

难点:layui的表格是自动渲染的,表格是通过一个统一的数据格式放入进去的,放什么数据,显示的就是什么数据。2.官方没有这方面的说明和解决方案。3、后端传过来的数据因layui框架的形式,只能传当前分页数据。4、layui框架表格的class名称和一些名称是共用的,很难获取精准需要的

代码思路:

layui.use(['layer', 'jquery', 'table'], function() {
    table.render({
        page: {
        },
        done: function (res, curr, count) {
            var len = res.data.length;
            var chooseNum = 0;   //记录当前页选中的数据行数
            for(var i = 0;i < len;i++){   //勾选行回显
                for(var key in idMap){
                    if(res.data[i].id == key){
                        res.data[i]["LAY_CHECKED"]='true';
                        //找到对应数据改变勾选样式,呈现出选中效果
                        var index= res.data[i]['LAY_TABLE_INDEX'];
                        $('tr[data-index=' + index + '] input[type="checkbox"]').prop('checked', true);
                        $('tr[data-index=' + index + '] input[type="checkbox"]').next().addClass('layui-form-checked');
                         chooseNum++;
                    }
                }
            }
            if(len != 0 && chooseNum == len){   //表示该页全选  --  全选按钮样式回显
                $('input[lay-filter="layTableAllChoose"]').prop('checked',true);
                $('input[lay-filter="layTableAllChoose"]').next().addClass('layui-form-checked');
            }
        },
        cols: colArr
    });
});

注意,使用layui的数据表格组件,它会动态生成一个新的table并填充内容,并不是用你写的那行<table class="layui-hide" id="industryList" lay-filter="industrySite"></table>,layui-hide:这个是隐藏的
由于是自动填充的,所有的id和class名称都是固定的,没有可以具体识别,所以如果一个页面有两个复选框的数据表格的要注意了,

//找到对应数据改变勾选样式,呈现出选中效果
var index= res.data[i][‘LAY_TABLE_INDEX’];
$(‘tr[data-index=’ + index + ‘] input[type=”checkbox”]’).prop(‘checked’, true);
$(‘tr[data-index=’ + index + ‘] input[type=”checkbox”]’).next().addClass(‘layui-form-checked’);

$('tr[data-index=' + index + ']这里由于有两个,也没有具体的标识,所以会影响两个。

在这里做一个补充,使用layui的时候,想要获取你选中的多选项可以通过
table.checkStatus('industryTable').data
其中industryTable是数据表格取的Id,
在这里插入图片描述
之前我的做法是在复选框监听事件
table.on('checkbox(industrySite)', function(obj){})
这里附上layui官网的说明

table.on(‘checkbox(test)’, function(obj){
console.log(obj.checked); //当前是否选中状态
console.log(obj.data); //选中行的相关数据
console.log(obj.type); //如果触发的是全选,则为:all,如果触发的是单选,则为:one
});

步骤:
去判断是否是单选还是全选
单选:

//选中
if(obj.checked == true){
     list=[]; //定义选择你要的数据 
     map={}; //存储选中记录的一个集合
     let index = list.indexOf(obj.data.XXX);
    //表示里面没有数据,添加
    if(index ==-1){
         list.push(obj.data.XXX);
    }
    //以下省略....

}else{//取消选中
    let index = list.indexOf(obj.data.XXX);
    //表示里面存在数据,删除
    if(index  >-1){
        list.splice(index,1);
    }
     //以下省略....
}

注意:
这种方法通过监听复选框的事件push添加的会出现一个问题,就是全选后,然后再次点击随便一个,会取消选中当前的复选框和全选的复选框,会导致监听事件table.on('checkbox(test)', function(obj){})
没有回调函数,意味着你拿不到任何值,后续做删除不了数组的值,然后添加的时候undefined又会判断为没有,添加进数组。本人测试过了,就这种情况有这个问题,就是全选和当前复选框一同取消选中效果才会发生,其他情况没有问题。

第二种(强烈推荐)
不管是单次点击还是点击全选,只要监听到了事件都重新直接赋值,不整那些push,splice啥的,啥事都没有问题

 //for循环获取自己想要的数据赋值
 table.checkStatus('industryTable').data //获取选中效果的所有数据

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~