您提供的代码没有任何问题。setState
如果正确调用应该可以工作。我敢打赌,问题出在您的其他组件或数据中。
这是一个使用您的代码的片段。我不知道你如何实现你的其他组件,所以我只是在这里做了一些假设。
class ReportMenu extends React.Component {
render() {
return <div className="well well-default">
<select className="form-control" onChange={(e) => {
this.props.filterBy(e.target.value)
}}>
<option> - </option>
{this.props.organizations.map(
(item, index) => <option key={index}>{item}</option>
)}
</select>
<br/>
<select className="form-control" onChange={(e) => {
this.props.filterBy(e.target.value)
}}>
<option> - </option>
{this.props.reportTypes.map(
(item, index) => <option key={index}>{item}</option>
)}
</select>
</div>
}
}
class ReportTable extends React.Component {
render() {
return <table className="table table-bordered">
<tbody>
{this.props.updatedReports.map(
(item, index) => <tr key={index}>
<td>{index}</td>
<td>{item.organizations}</td>
<td>{item.reportType}</td>
</tr>
)}
</tbody>
</table>
}
}
class ReportContent extends React.Component {
constructor(props) {
super(props);
this.state = {
currentReports: this.props.reports
};
}
_filterBy(option) {
let updatedReports = this.props.reports.filter(report => {
if (report.organizations === option || report.reportType === option) {
return report;
}
});
console.log(updatedReports);
this.setState({currentReports: updatedReports});
}
render() {
return (
<div className="reports-table">
<ReportMenu
organizations={this.props.organizations}
reportTypes={this.props.reportTypes}
filterBy={this._filterBy.bind(this)}/>
<ReportTable updatedReports={this.state.currentReports}/>
</div>
);
}
}
class App extends React.Component {
render() {
const reports = [
{
organizations: 'orgA',
reportType: 'typeA'
}, {
organizations: 'orgA',
reportType: 'typeB'
}, {
organizations: 'orgB',
reportType: 'typeA'
}, {
organizations: 'orgB',
reportType: 'typeB'
}
];
return <div className="container">
<h1 className="page-header">Reports</h1>
<ReportContent
reports={reports}
organizations={['orgA', 'orgB']}
reportTypes={['typeA', 'typeB']}/>
</div>
}
}
ReactDOM.render(<App/>, document.getElementById('root'));