ant-design tree 设置 checkStrictly为 true, 实现选中父节点: 选中-子节点全部选中,如果有上一级父节点,自动选中,取消-子节点全部取消,子节点选中: 父节点全部选中
时间: 2024-05-14 13:16:54 浏览: 239
可以通过设置 treeCheckable 为 true,并且设置 onCheck 回调函数来实现该需求。
具体实现方法如下:
1. 在 antd Tree 组件中设置 treeCheckable 为 true。
2. 在 Tree 组件的 onCheck 回调函数中,遍历选中的节点,并根据 checkStrictly 的值来判断是否选中父节点。
具体代码如下:
```jsx
import React, { useState } from 'react';
import { Tree } from 'antd';
const { TreeNode } = Tree;
const treeData = [
{
title: 'Parent 1',
key: '0-0',
children: [
{ title: 'Child 1', key: '0-0-0' },
{ title: 'Child 2', key: '0-0-1' },
{ title: 'Child 3', key: '0-0-2' },
],
},
];
const CheckableTree = () => {
const [checkedKeys, setCheckedKeys] = useState([]);
const onCheck = (checkedKeysValue, info) => {
setCheckedKeys(checkedKeysValue);
if (info.checked) {
// 选中节点
if (!info.node.isLeaf()) {
// 当前是父节点,且 checkStrictly 为 false
if (!info.node.props.checkStrictly) {
info.node.props.children.forEach((child) => {
const childKey = child.props.eventKey;
if (!checkedKeysValue.includes(childKey)) {
setCheckedKeys([...checkedKeysValue, childKey]);
}
});
}
} else {
// 当前是子节点
const parentKey = info.node.props.parent?.props.eventKey;
if (parentKey && !checkedKeysValue.includes(parentKey)) {
setCheckedKeys([...checkedKeysValue, parentKey]);
}
}
} else {
// 取消选中节点
if (!info.node.isLeaf()) {
// 当前是父节点,且 checkStrictly 为 false
if (!info.node.props.checkStrictly) {
info.node.props.children.forEach((child) => {
const childKey = child.props.eventKey;
if (checkedKeysValue.includes(childKey)) {
setCheckedKeys(checkedKeysValue.filter((key) => key !== childKey));
}
});
}
} else {
// 当前是子节点
const parentKey = info.node.props.parent?.props.eventKey;
if (parentKey && checkedKeysValue.includes(parentKey)) {
setCheckedKeys(checkedKeysValue.filter((key) => key !== parentKey));
}
}
}
};
const renderTreeNodes = (data) =>
data.map((item) => {
if (item.children) {
return (
<TreeNode
title={item.title}
key={item.key}
checkStrictly={true}
>
{renderTreeNodes(item.children)}
</TreeNode>
);
}
return <TreeNode {...item} checkStrictly={true} />;
});
return (
<Tree
checkable
checkedKeys={checkedKeys}
onCheck={onCheck}
>
{renderTreeNodes(treeData)}
</Tree>
);
};
export default CheckableTree;
```
其中,renderTreeNodes 函数用于递归渲染树节点。在 onCheck 回调函数中,根据节点类型和 checkStrictly 参数来进行判断,当选择父节点时,自动选择所有子节点;当选择子节点时,判断其父节点是否也需要选中。
注意,在 antd Tree 组件中,如果要实现 checkStrictly 参数生效,需要在 TreeNode 组件中设置 checkStrictly 参数。
阅读全文