javascript - 如何在 React 中访问孩子的状态
问题描述
又是我,
我有这个代码:
/* App.js */
class App extends Component {
state = {
active1: true,
active2: false,
active3: false,
active4: false,
}
render() {
if (this.state.active1) {
return(
<div className="wrapper">
<Header />
</div>
)
} else if (this.state.active2) {
return(
<div className="wrapper">
<Header />
</div>
)
} else if (this.state.active3) {
return(
<div className="wrapper">
<Header />
</div>
)
} else if (this.state.active4) {
return(
<div className="wrapper">
<Header />
</div>
)
}
return(
<div className="wrapper">
<Header />
</div>
)
}
}
如您所见,我有<Header />
'Header.js' 中的组件:
/* Header.js */
class Header extends Component {
state = {
active1: true,
active2: false,
active3: false,
active4: false,
}
render() {
return(
<header className="container">
<button className="buttonName" onClick={() => {
this.setState({
active1: true,
active2: false,
active3: false,
active4: false,
})
}}>Accueil</button>
<button className="buttonName" onClick={() => {
this.setState({
active1: false,
active2: true,
active3: false,
active4: false,
})
}}>Portfolio</button>
<button className="buttonName" onClick={() => {
this.setState({
active1: false,
active2: false,
active3: true,
active4: false,
})
}}>Curriculum</button>
<button className="buttonName" onClick={() => {
this.setState({
active1: false,
active2: false,
active3: false,
active4: true,
})
}}>Tarifs</button>
</header>
)
}
}
我在 React DevTools 上看到了一些东西: this.setState() 改变了状态<Header />
而不是状态<App />.
所以这是我的问题:我如何访问<Header />
状态以对其应用条件。因为这里的代码不起作用:
我不能这样写:
if (Header.state.active1) {//Do something}
因为它会引发错误。
那么你知道做同样的事情吗?
解决方案
对不起,但我认为你在这里做了一些过度工程。我想你正在尝试做类似的事情。
const menu = [
{ label: 'Item 1', id: 1 },
{ label: 'Item 2', id: 2 },
{ label: 'Item 3', id: 3 },
{ label: 'Item 4', id: 4 },
];
class Header extends React.Component {
render () {
const { items, setActive, active } = this.props;
return (
<header>
{
items.map(item => (
<button
className={active === item.id ? 'active': ''}
key={item.id}
onClick={() => setActive(item.id)}
>
{item.label}
</button>
))
}
</header>
);
}
}
class App extends React.Component {
state = {
active: 1,
};
setActive = (id) => {
this.setState({ active: id });
}
render() {
return(
<Header
items={menu}
active={this.state.active}
setActive={(id) => this.setActive(id)}
/>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('app'));
.active {
background: blue;
}
<div id="app"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
推荐阅读
- git - 个人访问令牌生成后 Git 不允许拉取请求
- c++ - 我可以根据它是用作左值还是右值来为返回引用的函数运行不同的逻辑吗?
- django - 在模板中使用 Django StreamingHttpResponse
- flutter - 如何将 BloC AppTheme 的 id 放入颤动并防止主题重新启动
- android - Android 应用程序给出错误 W/BroadcastQueueInjector
- java - Android 流媒体音频延迟随着时间的推移而增加
- c# - 反序列化 Protoc 生成的 C# 类会导致数据被清除
- c++ - OpenGL 使用 glm::rotate 围绕全局轴旋转
- kubernetes - 谷歌云平台 Flink k8s 操作员远程作业 jar 示例无法在 Minikube 上运行
- html - 为什么我的图像在较小的屏幕上从我的 div 中分离出来?