reactjs - 父子组件结构(ReactJS)
问题描述
我已经创建了多个处于同一级别的组件,这让我很难在它们之间传递数据。HealthForm 组件有一个输入字段,该字段接受主机 url,然后在单击按钮时获取 API。所有这些都运作良好。我需要将该 url 传递给所有其他组件(ProductForm、xForm、yForm、zForm ...)我现在拥有的是我的后端服务器保存了 url,但这会在多个浏览器使用该网页时产生影响。
我认为需要更改的是使 HealthForm 成为其他表单的父组件。但是,我的 App.js 看起来像这样,其中只有路由。单独的 HeaderTabs 链接到正确的路线...
编辑 代码现在成功保存并将 url 传递给其子组件。问题是当我更新 HealthForm 中的父状态时页面会重新呈现。
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
url: '',
};
this.setURL = this.setURL.bind(this);
}
setURL(page) {
this.setState({
url: page
});
console.log("Parent url: " + this.state.url);
}
render(){
return(
<MuiThemeProvider>
<Router>
<div className="App">
<Route path="/" component={()=>(
<div>
<Header/>
<HealthForm changeUrl={this.setURL} urlProp={this.state.url}/>)}>/>
</div>)}/>
<Route path="/path1" component={ProductForm}></Route>
<Route path="/path2" component={xForm}></Route>
<Route path="/path3" component={yForm}></Route>
<Route path="/path4" component={zForm}></Route>
</div>
</Router>
</MuiThemeProvider>
);
}
}
健康表格
class HealthForm extends React.Component {
constructor(props) {
super(props);
this.state = {
exampleURL: '',
exampleURLError: '',
status: '',
showStatus: false
};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
validate = () => {
//…checks for input errors
}
shouldComponentUpdate(nextProps, nextState) {
return nextProps !== nextState;
}
handleChange(event) {
this.setState({
[event.target.name]: event.target.value
});
}
handleSubmit(event) {
event.preventDefault();
const err = this.validate();
let that = this;
if (!err) {
this.setState({
exampleURLError: ''
});
console.log(this.state);
var data = this.state.exampleURL
fetch('http://somehost/health', {
method: 'POST',
body: JSON.stringify(data)
})
.then((res) => {
var promiseStatus = res.text();
promiseStatus.then(function (value) {
console.log("StatusHA: " + value);
that.setState({
status: value,
showStatus: true
});
if (that.shouldComponentUpdate(that.state.jarvisURL, that.props.urlProp))
that.props.changeUrl(that.state.jarvisURL);
});
}).catch((error) => {
console.log("Error: " + error);
});
}
}
render() {
return (
<form>
<TextField
...
/>
<br/>
<Button variant="contained" size="small" color="primary" onClick={e => this.handleSubmit(e)} >
Check
</Button>
<br /> <br />
...
</form>
);
}
}
export default HealthForm;
所有其他表格都与 HealthForm 非常相似。
如何重新组织我的代码以使 HealthForm 成为父组件?或者创建一个全新的父组件,所有表单都是它的子组件是一个更好的选择?如果是这样,有什么建议吗?
编辑
我进行了 Snaz 建议的更改,成功地将 url 发送到 App 的状态,但现在
this.props.changeUrl(url);
导致整个应用程序刷新?
解决方案
为什么不向 HealthForm 传递一个函数,它会改变 App 状态的属性,并且通过改变状态它会刷新并将其发送到其他表单?像这样的东西:
应用程序:
class App extends React.Component {
state = {
url: ''
}
foobar(page){
this.setState({
url: page
});
}
render(){
return(
[code here...]
<HealthForm changeUrl={this.foobar}/>
[code there...]
);
}
}
在 HandleSubmit 的 HealthForm 中,您只需调用:
this.props.changeUrl(url);
这应该将页面提供给 App,然后您可以通过此处显示的类似方式将此 url 传递给其他表单: https ://github.com/ReactTraining/react-router/issues/4105
推荐阅读
- javascript - 音乐机器人 discord.js 问题
- java - Java 8 资源包找不到立即创建的文件
- ios - 在 SwiftUI 导航栏中嵌入视图作为标题
- sql - Varchar 类型等于数字
- css - 在反应组件中重置样式
- windows - 无法使用安装了启用 Hyper-V 和 WSL2 的 VirtualBox 启动 Windows 10 来宾
- reactjs - VS2019 中的自动完成 JSX html 标签
- python - 使用自定义方法保存/加载 Keras 模型
- excel - 将同一列从多个工作表复制到新工作表
- android - Flutter 移动 UI 元素