javascript - 您如何从不同的组件更改反应组件的状态?
问题描述
我试图了解如何将道具传递给反应中的组件。我是新手,我一直在努力理解状态的基本原理。
我想要一个按钮来显示叠加层并暂时用一些任意文本填充该叠加层的“内容”。
我正在尝试使用一个名为 doWeDisplay 的道具作为变量来保存“none”或“absolute”的css值(隐藏和显示组件)和一个名为“content”的道具用于覆盖的内容。
这是我的代码,有人可以指出我正确的方向。我需要那个尤里卡时刻让它点击到位,我的头到处都是试图得到这个。
应用程序.js
import React from 'react';
import Overlay from './components/overlay';
import Header from './components/header';
import Body from './components/body';
import Footer from './components/footer';
import './App.css';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
console.log("App props", this.props)
return (
<div className="App">
<Overlay />
<Header />
<Body content={ this.props.appContent } />
<Footer />
</div>
);
}
}
export default App;
正文.js
import React from 'react';
import './body.css';
import Overlay from './overlay'
class Body extends React.Component {
constructor(props) {
super(props);
this.state = {
doWeDisplay : "absolute",
content : "Go on"
};
}
render() {
function handleClick(e) {
console.log("Click")
Overlay.setState((state, props) => ({
doWeDisplay : "absolute",
content : "Go on"
}))
}
console.log("Body props ", this.props);
return (
<div className="App-Body">
<p>Here is the body of the page.</p>
<button onClick={ handleClick }>Click me</button>
</div>
);
}
}
export default Body
覆盖.js
import React from 'react';
import './overlay.css';
class Overlay extends React.Component {
constructor(props) {
super(props);
this.state = {
doWeDisplay : props.doWeDisplay,
content : props.doWeDisplay
};
}
render() {
console.log("Overlay props " , this.props)
return (
<div className="App-Overlay" style={{ display: this.state.doWeDisplay }}>
{ this.state.content }
</div>
);
}
}
export default Overlay
解决方案
当您有可以更改其他状态的兄弟组件时,您将需要在父组件中处理该状态(在您的情况下是App
)。
所以handleClick()
函数应该在父组件中,变量的状态本身doWeDisplay
也content
应该在App
。
Body
然后,您可以将该函数作为道具传递给它,这样您就可以在Body
组件内单击时触发它。clickFunc
我在我的例子中调用了那个道具。
最后,您需要做的最后一件事是将当前状态传递给Overlay
as props,因此我将doWeDisplay
andcontent
作为不同的 props 传递,它从App
的状态中获取值。
它应该看起来像这样:
应用程序.js
import React from 'react';
import Overlay from './components/overlay';
import Header from './components/header';
import Body from './components/body';
import Footer from './components/footer';
import './App.css';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
doWeDisplay: "absolute",
content: "Go on"
};
}
handleClick = () => {
console.log("Click");
this.setState({
doWeDisplay: "absolute",
content: "Go on CHANGED!"
});
};
render() {
console.log("App props", this.props);
return (
<div className="App">
<Overlay
doWeDisplay={this.state.doWeDisplay}
content={this.state.content}
/>
<Body clickFunc={this.handleClick} content={this.props.appContent} />
</div>
);
}
}
export default App;
正文.js
import React from 'react';
import './body.css';
import Overlay from './overlay'
class Body extends React.Component {
render() {
console.log("Body props ", this.props);
return (
<div className="App-Body">
<p>Here is the body of the page.</p>
<button onClick={() => this.props.clickFunc()}>Click me</button>
</div>
);
}
}
export default Body
覆盖.js
import React from 'react';
import './overlay.css';
class Overlay extends React.Component {
render() {
console.log("Overlay props ", this.props);
return (
<div className="App-Overlay" style={{ display: this.props.doWeDisplay }}>
{this.props.content}
</div>
);
}
}
export default Overlay
这是代码框
推荐阅读
- powershell - Add-ADGroupMember : 服务器不愿意处理请求
- apache - 如何在 Windows 中使用 XAMPP 设置反向代理服务器
- sdk - 使用 Cosmos SDK 如何解决:解析日志级别失败
- google-apps-script - Google表格:每次单元格更改时,我都希望数据库中的新行是单元格值+时间戳
- elasticsearch - Kibana API 操作和连接器 API 返回 404
- graph - 是否有一种体面的算法可以在加权有向图中找到最短跨度游走?
- javascript - 在应用程序中禁用所有表单自动完成的最短方法。不是通过为每个表单添加自动完成功能
- sql - Athena - 将 json 提取到行
- python - 颤振,Chaquopy 示例
- angular - 如何为服务Angular提供模型类