Skip to content
Open
32 changes: 26 additions & 6 deletions js/tree/tree-node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -863,6 +863,11 @@
if (!tree.nodeMap.get(value)) return false;
// 节点不可选,视为未选中
if (!this.isCheckable()) return false;
// 禁用节点保持原有选中状态
if (this.isDisabledState()) {
const checkedMap = map || tree.checkedMap;
return !!checkedMap.get(value);
}
const checkedMap = map || tree.checkedMap;
// 严格模式,则已经可以判定选中状态
if (checkStrictly) {
Expand All @@ -882,11 +887,17 @@
}
// 如果 valueMode 为 onlyLeaf 并且当前节点是父节点,则进一步判断
if (Array.isArray(children) && children.length > 0) {
// 子节点全部选中,则当前节点选中
checked = children.every((node) => {
const childIsChecked = node.isChecked(checkedMap);
return childIsChecked;
});
// 子节点全部选中(排除禁用节点),则当前节点选中
const enabledChildren = children.filter(node => !node.isDisabled());
if (enabledChildren.length > 0) {
checked = enabledChildren.every((node) => {
const childIsChecked = node.isChecked(checkedMap);
return childIsChecked;

Check failure on line 895 in js/tree/tree-node.ts

View workflow job for this annotation

GitHub Actions / test

Expected parentheses around arrow function argument
});
} else {
// 如果所有子节点都被禁用,则视为未选中
checked = false;
}
} else {
// 从父节点状态推断子节点状态
// 这里再调用 isChecked 会导致死循环
Expand Down Expand Up @@ -1306,7 +1317,16 @@
map.delete(this.value);
children.forEach((node) => {
// 对于 UI 动作,向下扩散时,禁用状态会阻止状态切换
if (options.isAction && node.isDisabledState()) return;
if (options.isAction && node.isDisabledState()) {
// 保持禁用节点的原有选中状态
const originalChecked = node.isChecked();
if (originalChecked) {
map.set(node.value, true);
} else {
map.delete(node.value);
}
return;
}
if (checked) {
map.set(node.value, true);
} else {
Expand Down
Loading