reactjs - 如何通过单击同级组件在反应中显示/隐藏组件
问题描述
我有一个父组件“app.js”,其中包含标题和图表等子组件。图表组件有两个子组件 (chart1 & chart2) 在标题上,我有 2 个可点击的链接,分别命名为 (chart1, chart2)。我的目标是通过单击标题链接“chart1 & chart2”来显示/隐藏每个图表。据我了解,我需要创建两个状态;父级中的 isHiddenChart1 和 isHiddenChart2 并将它们传递给标题和图表组件。另外,我需要创建两个函数;每次单击链接时都会更改状态的 toggleHideChart1 和 toggleHideChart2,并将这些函数传递给 Header 组件。但是,我尝试这样做,但是当单击标题中的链接时,没有任何变化!
以下是 app.js 代码
export default class App extends Component {
constructor (props) {
super(props)
this.state = {
isHiddenChart1: false,
isHiddenChart2: true
}
this.toggleHiddenChart1 = this.toggleHiddenChart1.bind(this)
this.toggleHiddenChart2 = this.toggleHiddenChart2.bind(this)
}
toggleHiddenChart1 () {
this.setState({
isHiddenChart1: !this.state.isHiddenChart1
})
}
toggleHiddenChart2 () {
this.setState({
isHiddenChart2: !this.state.isHiddenChart2
})
}
render(){
return (
<React.Fragment>
<Header
isHiddenChart1={this.state.isHiddenChart1}
isHiddenChart2={this.state.isHiddenChart2}
onClick={() => this.isHiddenChart1}
onClick={() => this.isHiddenChart2}
/>
<Chart
isHiddenChart1={this.state.isHiddenChart1}
isHiddenChart2={this.state.isHiddenChart2}
/>
</React.Fragment>
);
}
}
header.js
<Link to="#" onClick={() => this.props.toggleHiddenChart1}> Chart1 </Link>
<Link to="#" onClick={() => this.props.toggleHiddenChart2}> Chart2 </Link>
图表.js
{!this.props.isHiddenChart1 && <Chart1 />}
{!this.props.isHiddenChart2 && <Chart2 />}
我不确定这是否是在反应中传递状态和函数的正确方法,但是chart1 显示在开头,而chart2 被隐藏了,所以传递状态就像我假设的那样工作正常!
解决方案
我宁愿不创建 2 个单独的状态变量,我只会创建一个指定哪个图表处于活动状态的单一状态变量。
export default class App extends Component {
constructor(props) {
super(props);
this.state = {
activeChart: null,
};
this.toggleChart = this.toggleChart.bind(this);
}
toggleChart(chart) {
this.setState(prevState => ({
activeChart:chart,
});
}
render() {
return (
<React.Fragment>
<Header
activeChart={this.state.activeChart}
onClick={this.toggleChart}
/>
<Chart
activeChart={this.state.activeChart}
/>
</React.Fragment>
);
}
}
页眉.js
<Link to="#" onClick={() => this.props.toggleChart("chart1")}> Chart1 </Link>
<Link to="#" onClick={() => this.props.toggleChart("chart2")}> Chart2 </Link>
图表.js
switch(this.state.activeChart) {
case "chart1":
return <Chart1 />
case "chart2":
return <Chart2 />
default:
return null;
}
希望这可以帮助!
推荐阅读
- excel - 数据透视表更改单元格颜色
- sqlite - SQLite 实体框架 Azure 应用 sqlite3_blob_open 没有实现
- r - 来自 PLSR 的相关加载图与使用 ggplot2 的观察结果
- dedicated-server - 如何跨专用主机迁移 ECS 实例
- python - python上固定长度二进制数的二进制重合数
- xml - 如果第一个元素为空,则选择第二个元素的 XPath
- angular - Angular 6 Material - 组件不是已知元素
- python - CNN嵌入层的实现
- php - 如何在 Laravel 5.6 的控制器中验证图像存储
- php - 在 PHP 中传递一个值