基于layui的table插件实现复选框联动的两种方案与源码修改法
本文介绍在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插件实现复选框联动的完整方案即为本文分享内容,旨在提供参考,欢迎支持本站。
JS转整数出现NaN怎么办?常见异常处理方案
2026-11-05 16:27:31
推荐几款免安装的在线JS压缩工具
2026-11-05 14:54:53
JS怎么使用JSON.stringify实现JSON格式化与缩进
2026-11-04 10:47:30
CodePen、JSFiddle 与 StackBlitz:主流 JS 在线编辑器对比
2026-11-03 21:07:49
JS字符串转数字后怎么正确判断是否为有效数值
2026-11-03 20:04:15
