【发布时间】:2020-07-20 13:58:02
【问题描述】:
我有一个嵌套的复选框树,我可以在其中根据搜索字段过滤掉项目。当我搜索它选择项目时,场景明智,但每当我删除搜索项目时,它都不会保留。我正在尝试搜索http,当我检查然后删除搜索文本时,检查的项目没有被保留
有人可以帮我吗?
import React from "react";
import CheckboxTree from "react-checkbox-tree";
import "react-checkbox-tree/lib/react-checkbox-tree.css";
const nodes = [
{
value: "/app",
label: "app",
children: [
{
value: "/app/Http",
label: "Http",
children: [
{
value: "/app/Http/Controllers",
label: "Controllers",
children: [
{
value: "/app/Http/Controllers/WelcomeController.js",
label: "WelcomeController.js"
}
]
},
{
value: "/app/Http/routes.js",
label: "routes.js"
}
]
},
{
value: "/app/Providers",
label: "Providers",
children: [
{
value: "/app/Http/Providers/EventServiceProvider.js",
label: "EventServiceProvider.js"
}
]
}
]
},
{
value: "/config",
label: "config",
children: [
{
value: "/config/app.js",
label: "app.js"
},
{
value: "/config/database.js",
label: "database.js"
}
]
},
{
value: "/public",
label: "public",
children: [
{
value: "/public/assets/",
label: "Welcome",
children: [
{
value: "/public/assets/style.css",
label: "style.css"
}
]
},
{
value: "/public/index.html",
label: "index.html"
}
]
},
{
value: "/.env",
label: ".env"
},
{
value: "/.gitignore",
label: ".gitignore"
},
{
value: "/README.md",
label: "README.md"
}
];
class Widget extends React.Component {
state = {
checked: [],
expanded: [],
filterText: "",
nodesFiltered: nodes,
nodes
};
constructor(props) {
super(props);
this.onCheck = this.onCheck.bind(this);
this.onExpand = this.onExpand.bind(this);
this.onFilterChange = this.onFilterChange.bind(this);
this.filterTree = this.filterTree.bind(this);
this.filterNodes = this.filterNodes.bind(this);
}
onCheck(checked) {
this.setState({ checked });
}
onExpand(expanded) {
this.setState({ expanded });
}
onFilterChange (e) {
this.setState({ filterText: e.target.value }, this.filterTree);
}
filterTree() {
// Reset nodes back to unfiltered state
if (!this.state.filterText) {
this.setState(prevState => ({
nodesFiltered: prevState.nodes
}));
return;
}
const nodesFiltered = prevState => ({
nodesFiltered: prevState.nodes.reduce(this.filterNodes, [])
});
this.setState(nodesFiltered);
}
filterNodes(filtered, node) {
const { filterText } = this.state;
let children;
if (!!node.children) {
children = node.children.reduce(this.filterNodes, []);
}
if (node.label.toLocaleLowerCase().indexOf(filterText.toLocaleLowerCase()) > -1 | (children && children.length)
)
{
var expanded = [];
expanded = [node.value, ...this.getAllValuesFromNodes(children)];
this.setState({ expanded });
if (!!node.children) {
filtered.push({ ...node, children });
} else {
filtered.push(node);
}
}
return filtered;
}
getAllValuesFromNodes = (nodes, leafnode) => {
const values = [];
if (!!nodes)
for (let n of nodes) {
values.push(n.value);
if (n.children) {
values.push(...this.getAllValuesFromNodes(n.children, false));
}
}
return values;
};
render() {
const { checked, expanded, filterText, nodesFiltered } = this.state;
return (
<div className="filter-container">
<input
className="filter-text"
placeholder="Search..."
type="text"
value={filterText}
onChange={this.onFilterChange}
/>
<CheckboxTree
checked={checked}
expanded={expanded}
nodes={nodesFiltered}
onCheck={this.onCheck}
onExpand={this.onExpand}
/>
</div>
);
}
}
export default Widget;
【问题讨论】:
标签: javascript reactjs ecmascript-6 setstate