antd tree 只搜索到父节点 不包含隐藏其他节点
时间: 2024-01-11 08:04:27 浏览: 32
如果您想要在搜索时只搜索到符合条件的父节点,并且不包含隐藏其他节点,您可以在搜索时只设置符合条件的父节点的 `visible` 属性为 `true`,然后将其子节点的 `visible` 属性设置为 `false`,这样就可以保证只有符合条件的父节点被搜索到,并且不会显示隐藏的其他节点。具体实现可以参考以下代码:
```jsx
import { Tree } from 'antd';
import { useState } from 'react';
const { TreeNode } = Tree;
const generateTreeData = (count) => {
const treeData = [];
for (let i = 1; i <= count; i++) {
const node = {
title: `Node ${i}`,
key: i.toString(),
visible: true,
children: [],
};
for (let j = 1; j <= 3; j++) {
const childNode = {
title: `Node ${i}-${j}`,
key: `${i}-${j}`,
visible: true,
children: [],
};
for (let k = 1; k <= 3; k++) {
const grandchildNode = {
title: `Node ${i}-${j}-${k}`,
key: `${i}-${j}-${k}`,
visible: true,
children: [],
};
childNode.children.push(grandchildNode);
}
node.children.push(childNode);
}
treeData.push(node);
}
return treeData;
};
const TreeWithSearch = () => {
const [searchText, setSearchText] = useState('');
const [treeData, setTreeData] = useState(generateTreeData(5));
const handleSearch = (value) => {
setSearchText(value);
const filterTreeData = (data) => {
return data.map((node) => {
const lowerCaseTitle = node.title.toLowerCase();
const lowerCaseSearchText = value.toLowerCase();
if (lowerCaseTitle.includes(lowerCaseSearchText)) {
node.visible = true;
if (node.children && node.children.length > 0) {
node.children = node.children.map((childNode) => {
childNode.visible = false;
return childNode;
});
}
} else {
node.visible = false;
node.children = filterTreeData(node.children);
}
return node;
});
};
setTreeData(filterTreeData(treeData));
};
const renderTreeNodes = (data) => {
return data.map((node) => {
if (!node.visible) {
return null;
}
if (node.children && node.children.length > 0) {
return (
<TreeNode key={node.key} title={node.title}>
{renderTreeNodes(node.children)}
</TreeNode>
);
}
return <TreeNode key={node.key} title={node.title} />;
});
};
return (
<div>
<input value={searchText} onChange={(e) => handleSearch(e.target.value)} placeholder="Search" />
<Tree>{renderTreeNodes(treeData)}</Tree>
</div>
);
};
```
在这个实现中,我们在搜索时只设置符合条件的父节点的 `visible` 属性为 `true`,然后将其子节点的 `visible` 属性设置为 `false`,这样就可以保证只有符合条件的父节点被搜索到,并且不会显示隐藏的其他节点。最后在渲染树节点时,我们根据每个节点的 `visible` 属性来决定是否显示该节点。