fix(treeTable): 修复 checkbox 重复更新 (#2528)

* perf(treeTable): 优化行选中性能

* revert hightlightSelectedRow
pull/2543/head
morning-star 2025-03-05 22:24:45 +08:00 committed by GitHub
parent 242c94f57c
commit ba2106a6e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 9 deletions

View File

@ -1746,6 +1746,9 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
var isCheckMult = layui.type(opts.index) === 'array'; // 是否操作多个 var isCheckMult = layui.type(opts.index) === 'array'; // 是否操作多个
var isCheckAllOrMult = isCheckAll || isCheckMult; // 是否全选或多选 var isCheckAllOrMult = isCheckAll || isCheckMult; // 是否全选或多选
// treeTable 内部已处理选中,此处不再处理
if(options.tree && options.tree.view) return;
// 全选或多选时 // 全选或多选时
if (isCheckAllOrMult) { if (isCheckAllOrMult) {
that.layBox.addClass(DISABLED_TRANSITION); // 减少回流 that.layBox.addClass(DISABLED_TRANSITION); // 减少回流
@ -1839,7 +1842,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
if(isCheckAllOrMult){ if(isCheckAllOrMult){
setTimeout(function(){ setTimeout(function(){
that.layBox.removeClass(DISABLED_TRANSITION); that.layBox.removeClass(DISABLED_TRANSITION);
},100) }, 100)
} }
}; };

View File

@ -1762,10 +1762,10 @@ layui.define(['table'], function (exports) {
that.setRowCheckedClass(checkboxElem.closest('tr'), checked); that.setRowCheckedClass(checkboxElem.closest('tr'), checked);
// 设置原始复选框 checked 属性值并渲染 // 设置原始复选框 checked 属性值并渲染
form.render(checkboxElem.prop({ checkboxElem.prop({
checked: checked, checked: checked,
indeterminate: itemP[LAY_CHECKBOX_HALF] indeterminate: itemP[LAY_CHECKBOX_HALF]
})) })
}) })
} }
@ -1794,10 +1794,10 @@ layui.define(['table'], function (exports) {
} }
isIndeterminate = isIndeterminate && !isAll; isIndeterminate = isIndeterminate && !isAll;
form.render(tableView.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({ tableView.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({
'checked': isAll, 'checked': isAll,
indeterminate: isIndeterminate indeterminate: isIndeterminate
})); })
return isAll return isAll
} }
@ -1909,7 +1909,7 @@ layui.define(['table'], function (exports) {
// 取消当前选中行背景色 // 取消当前选中行背景色
that.setRowCheckedClass(radioElem.closest('tr'), false); that.setRowCheckedClass(radioElem.closest('tr'), false);
form.render(radioElem.prop('checked', false)); radioElem.prop('checked', false);
} }
}); // 取消其他的选中状态 }); // 取消其他的选中状态
trData[checkName] = checked; trData[checkName] = checked;
@ -1917,7 +1917,7 @@ layui.define(['table'], function (exports) {
that.setRowCheckedClass(trElem, checked); // 标记当前选中行背景色 that.setRowCheckedClass(trElem, checked); // 标记当前选中行背景色
that.setRowCheckedClass(trElem.siblings(), false); // 取消其他行背景色 that.setRowCheckedClass(trElem.siblings(), false); // 取消其他行背景色
form.render(trElem.find('input[type="radio"][lay-type="layTableRadio"]').prop('checked', checked)); trElem.find('input[type="radio"][lay-type="layTableRadio"]').prop('checked', checked);
} else { } else {
// 切换只能用到单条,全选到这一步的时候应该是一个确定的状态 // 切换只能用到单条,全选到这一步的时候应该是一个确定的状态
checked = layui.type(checked) === 'boolean' ? checked : !trData[checkName]; // 状态切换,如果遇到不可操作的节点待处理 todo checked = layui.type(checked) === 'boolean' ? checked : !trData[checkName]; // 状态切换,如果遇到不可操作的节点待处理 todo
@ -1936,7 +1936,7 @@ layui.define(['table'], function (exports) {
}).join(',')); }).join(','));
that.setRowCheckedClass(checkboxElem.closest('tr'), checked); // 标记当前选中行背景色 that.setRowCheckedClass(checkboxElem.closest('tr'), checked); // 标记当前选中行背景色
form.render(checkboxElem.prop({checked: checked, indeterminate: false})); checkboxElem.prop({checked: checked, indeterminate: false});
var trDataP; var trDataP;
@ -1945,7 +1945,7 @@ layui.define(['table'], function (exports) {
// 找到父节点,然后判断父节点的子节点是否全部选中 // 找到父节点,然后判断父节点的子节点是否全部选中
trDataP = that.getNodeDataByIndex(trData[LAY_PARENT_INDEX]); trDataP = that.getNodeDataByIndex(trData[LAY_PARENT_INDEX]);
} }
return that.updateCheckStatus(trDataP, checked); return that.updateCheckStatus(trDataP, checked);
} }
} }