【发布时间】:2017-11-23 20:43:25
【问题描述】:
我在将父组件的状态绑定到子组件的状态时遇到问题。看一下代码:
父组件:
class ParentForm extends React.Component {
constructor(){
super();
this.state = {
showDialog: false
};
}
toggleDialog() {
this.setState({showDialog: !this.state.showDialog});
}
return (
<div >
<Button color='primary' onClick={() => this.toggleDialog()}></Button>
<MyDialog open={this.state.showDialog}/>
</div>
);
}
子组件:
export default class MyDialog extends Component {
constructor(props){
super(props);
this.state = {
open: this.props.open
};
}
handleRequestClose = () => {
this.setState({ open: false });
};
render() {
return (
<div>
<Dialog
fullScreen
open={this.state.open}
onRequestClose={() => this.handleRequestClose()}
transition={<Slide direction="up" />}
>
<DialogTitle>{'Title'}</DialogTitle>
<DialogContent>
<DialogContentText>
This is my dialog
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={() => this.handleRequestClose()} color="primary">Close</Button>
</DialogActions>
</Dialog>
</div>
);
}
}
在父组件中,如果我将 state.showDialog 属性设置为 true,则该对话框将在页面加载时打开。但是一旦我关闭它一次,我就再也无法打开它了。如果我将其设置为 false,则在页面加载时它不会加载,并且我永远无法打开对话框,即使我单击父组件上的按钮也是如此。提前感谢您抽出宝贵时间提供帮助。
【问题讨论】:
-
您不应该将组件的状态值设置为属性值。关键是,如果您从父级更改属性,则会触发重新渲染,并且此新值将传递给子级并成为
this.props.whatever的新值。所以在孩子身上,你应该使用this.props.open
标签: javascript reactjs react-redux material-ui