使用 ReactJS (es6) 和兄弟组件打开模态
Open modal with ReactJS (es6) and siblings components
我的应用程序组件包含 Navbar 组件和 ModalLogin 组件。
应用组件:
class App extends React.Component {
render() {
return (
<div>
<Navbar history={this.props.history} />
{this.props.children}
<ModalLogin />
</div>
);
}
}
导航栏组件
class Navbar extends React.Component {
constructor(props) {
super(props);
this.state = NavbarStore.getState();
this.onChange = this.onChange.bind(this);
}
componentDidMount() {
NavbarStore.listen(this.onChange);
}
onChange(state) {
this.setState(state);
}
render() {
return (
<nav className='navbar navbar-default navbar-static-top'>
<ul className='nav navbar-nav'>
<li><a href="#">Login</a></li>
</ul>
</nav>
)
}
并且 ModalLogin 使用 react-bootstrap:
render() {
return (
<div>
<Modal show={this.state.showModal} onHide={ModalLoginActions.close}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>
</Modal.Body>
</Modal>
)
}
但是如您所见,Navbar 和 Modal 在我的应用程序中是兄弟姐妹。这是正确的方法吗?
编写一个 onClick 处理程序,在父级中触发一个事件。
render() {
return (
<nav className='navbar navbar-default navbar-static-top'>
<ul className='nav navbar-nav'>
<li><a href="#" onClick={this.props.onLogin}>Login</a></li>
</ul>
</nav>
)
向将 showModal 状态设置为 true 的 App 组件添加处理程序。
<Navbar
history={this.props.history}
onLogin={() => this.setState({showModal: true})}
/>
将 showModal 传递给 ModalLogin 组件。
<ModalLogin showModal={this.state.showModal} />
在 ModalLogin 中,使用道具显示 Modal。
Modal show={this.props.showModal} onHide={ModalLoginActions.close}>
我的应用程序组件包含 Navbar 组件和 ModalLogin 组件。
应用组件:
class App extends React.Component {
render() {
return (
<div>
<Navbar history={this.props.history} />
{this.props.children}
<ModalLogin />
</div>
);
}
}
导航栏组件
class Navbar extends React.Component {
constructor(props) {
super(props);
this.state = NavbarStore.getState();
this.onChange = this.onChange.bind(this);
}
componentDidMount() {
NavbarStore.listen(this.onChange);
}
onChange(state) {
this.setState(state);
}
render() {
return (
<nav className='navbar navbar-default navbar-static-top'>
<ul className='nav navbar-nav'>
<li><a href="#">Login</a></li>
</ul>
</nav>
)
}
并且 ModalLogin 使用 react-bootstrap:
render() {
return (
<div>
<Modal show={this.state.showModal} onHide={ModalLoginActions.close}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>
</Modal.Body>
</Modal>
)
}
但是如您所见,Navbar 和 Modal 在我的应用程序中是兄弟姐妹。这是正确的方法吗?
编写一个 onClick 处理程序,在父级中触发一个事件。
render() {
return (
<nav className='navbar navbar-default navbar-static-top'>
<ul className='nav navbar-nav'>
<li><a href="#" onClick={this.props.onLogin}>Login</a></li>
</ul>
</nav>
)
向将 showModal 状态设置为 true 的 App 组件添加处理程序。
<Navbar
history={this.props.history}
onLogin={() => this.setState({showModal: true})}
/>
将 showModal 传递给 ModalLogin 组件。
<ModalLogin showModal={this.state.showModal} />
在 ModalLogin 中,使用道具显示 Modal。
Modal show={this.props.showModal} onHide={ModalLoginActions.close}>