Открытый модал с компонентами ReactJS (es6) и родными братьями

У меня есть компонент приложения с компонентом Navbar и компонентом ModalLogin.

Компонент приложения:

class App extends React.Component {
  render() {
    return (
      <div>
        <Navbar history={this.props.history} />
        {this.props.children}
        <ModalLogin />
      </div>
    );
  }
}

Компонент Navbar

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 использует ответную загрузку:

 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 - братья и сестры в моем приложении. Это правильный путь?

1 ответ

Решение

Написать обработчик 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>
  )

Добавьте обработчик к компоненту App, который устанавливает состояние showModal в true.

<Navbar 
  history={this.props.history} 
  onLogin={() => this.setState({showModal: true})}
/>

Передайте showModal компоненту ModalLogin.

<ModalLogin showModal={this.state.showModal} />

Внутри ModalLogin используйте реквизит, чтобы показать модал.

Modal show={this.props.showModal} onHide={ModalLoginActions.close}>
Другие вопросы по тегам