基于layui的table插件实现复选框联动的两种方案与源码修改法

作者:清欢

时间:2026-10-23

浏览:471

本文介绍在layui table插件中实现复选框联动的两种方法。第一种利用table的reload和form.render方法,无需修改源码但代码量大且非局部刷新;第二种通过修改table源码添加mysetCheck方法,实现局部刷新且代码简洁,但需注意版本迁移及避免无限循环。

文章目录

layui table复选框联动实现背景

实际项目需求:

为员工账号配置权限(包含新增与更新权限操作)

实现逻辑:

通过表格呈现权限列表 -> 勾选指定账号的权限 -> 执行接口调用

权限关联与联动问题

遇到的挑战:

部分权限存在依赖关系,例如:“查看材料”与“修改材料”相互关联。勾选“修改材料”时,需自动勾选“查看材料”;取消“查看材料”时,需同步取消“修改材料”。

因此,当用户勾选特定权限时,需通过JS逻辑判断是否存在关联权限,并自动执行勾选或取消操作。

原生layui table插件未提供JS自动操作复选框的方法;

基于reload与render的解决方案

解决策略:

利用table的reload方法与form的render方法协同实现

设计思路:

reload方案代码示例


//以查看材料和修改材料权限为例:查看材料的id为2,修改材料的id为3
//用户点击复选框时,触发的回调函数
table.on('checkbox(quanXianAll)', function(obj) {
 //判断是否是全选
 if (obj.type === "one") {
   //判断判断选中的权限是否为“修改材料”
   if (obj.data.id === 3) {
    //判断是否选中状态
    if (obj.checked) {
     tableIns.reload({
      data:data,
      done: function (res) {
       //根据“查看材料”权限的id获取的索引
       var n = res.data.findIndex(function (item, i) {
        if (item.id === 2) {
         return true
        }
       })
       //判断查看材料”权限是否已被勾选
       if(!res.data[n].LAY_CHECKED){
        res.data[n].LAY_CHECKED = true;
        $(".layui-table-body").find("tr[data-index=" + n + "]").find('input[name="layTableCheckbox"]').prop("checked", true);
        form.render('checkbox');
       }

      }
     })
    }
   }
  }
})

鉴于关联关系可能不止一处,需对代码进行封装处理。(此处省略封装细节,直接展示代码)

修改源码实现局部刷新

在table源码文件中新增如下方法:

在table源码的a.elem.on("click", 'input[name="layTableCheckbox"]+', function () {}回调内,插入以下逻辑:

源码修改细节


var mylaysetCheck= function (index,checked,callbacks) {
 var e=t("table[lay-filter="+f+"]").next().find(".layui-table-box").find(".layui-table-main").find("tr[data-index="+index+"]"),
  l = e.parents("tr").eq(0).data("index"), n = e[0].checked,
  o = "layTableAllChoose" === e.attr("lay-filter");

 e.find('input[name="layTableCheckbox"]').prop("checked",checked);
 if(callbacks){
  this.setCheckData(index, checked), this.syncCheckAll();a.renderForm("checkbox");
  layui.event.call(this, s, "checkbox(" + f + ")", {
   checked: n,
   data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
   type: o ? "all" : "one",
   mysetCheck:mylaysetCheck.bind(a)
  })
 }else {
  this.setCheckData(index, checked), this.syncCheckAll();a.renderForm("checkbox");

 }
};

在table源码中:


a.elem.on("click", 'input[name="layTableCheckbox"]+', function () {}方法内有一个layui.event.call()函数===> 源码为:

layui.event.call(this, s, "checkbox(" + f + ")", {
 checked: n,
 data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
 type: o ? "all" : "one"
})

修改为:

事件监听修改


layui.event.call(this, s, "checkbox(" + f + ")", {
 checked: n,
 data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
 type: o ? "all" : "one",
 mysetCheck:mylaysetCheck.bind(a)
})

通过以下代码进行调用:

调用方式示例


//用户点击复选框时,触发的回调函数
table.on('checkbox(test)', function(obj){
 //两个参数,第一个是数组的索引,第二个是是否勾选,第三个是否使用回调函数
 obj.mysetCheck(index,checked,callbacks);
});

//案例:查看材料的id为2,索引为2;修改材料的id为3,索引为3
table.on('checkbox(quanXianAll)', function(obj){
 if(obj.data.id===3&&obj.checked){
  obj.mysetCheck(2,true,true);
 }
 if(obj.data.id===2&&!obj.checked){
  obj.mysetCheck(3,false,true);
 }

});
//这样就可以实现:勾选“修改材料”时也会把“查看材料”勾选上,取消勾选“查看材料”时也会取消“修改材料”的勾选

两种方案对比与注意事项

方案对比:

第一种方案无需修改源码,但代码冗余且非局部刷新;

第二种方案支持局部刷新,代码简洁,但需修改源码,涉及版本兼容性问题,且若业务逻辑处理不当,易引发无限循环;

以上基于layui table插件实现复选框联动的完整方案即为本文分享内容,旨在提供参考,欢迎支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章