Управление модальностями с помощью состояний и реквизита - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь использовать Reactstrap для создания модалов, которые появляются при навигации по навигационной панели.

Моя стратегия состоит в том, чтобы изменить состояние в родительском компоненте и передать их в качестве реквизита атрибуту isOpen для управления открытием модалов.

Проблема в том, что при смене реквизита в дочернем компоненте не выполняется повторная визуализация компонентов, поэтому я не могу закрыть модальные окна!

Родительский контроллер:

class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      zipcode : '',
      zipEntered: false
      };
    this.onZipCodeChange = this.onZipCodeChange.bind(this);
    this.isAuth = this.isAuth.bind(this);
  }

  componentDidMount() {
    this.setState({signup:false});
    if(this.state.zipcode !== '' || this.state.zipcode !== undefined){
      this.setState({zipEntered:true});
      this.setState({zipcode:this.state.zipcode});
    } else {
      this.setState({zipcode: '' });
      this.setState({zipEntered:false});
    }
  }

  onZipCodeChange(zip){
    //console.log('App has detected ZipCode Change: '+zip);
    this.setState({zipcode: zip});
    this.setState({zipEntered:false});
  }

  isAuth(token){
    console.log("App has token: "+ token);
    //pull data from token
  }

  render() {
    return (
        <div className="App">
          <header>
            <nav className="navbar navbar-expand-lg navbar-light bg-light">
              <a className="navbar-brand" href="#">InkSpace</a>
              <button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                <span className="navbar-toggler-icon"></span>
              </button>
              <div className="collapse navbar-collapse" id="navbarNav">
                <ul className="navbar-nav">
                <li className="nav-item">
                  <a className="nav-link" onClick={() => {this.setState({zipEntered:true})}}>Change Zipcode</a>
                </li>
                  <li className="nav-item">
                    <a className="nav-link" onClick={() => {this.setState({signup:true})}}>Tattooist</a>
                  </li>
                  <li className="nav-item">
                    <a className="nav-link" href="#">FAQ</a>
                  </li>
                  <li className="nav-item">
                    <a className="nav-link disabled" href="#">Shop</a>
                  </li>
                </ul>
              </div>
            </nav>
          </header>
          <ZipCode onSubmit={this.onZipCodeChange} isOpen={this.state.zipEntered} />
          <GMap zipcode={this.state.zipcode} />
      </div>
    );
  }
}

export default App;

Детский контроллер:

class ZipCode extends React.Component {
  constructor(props) {
      super(props);
      this.state = {
        zipcode:''          };
      this.submitZipCode = this.submitZipCode.bind(this);
      this.zipcodeChange = this.zipcodeChange.bind(this);
    }

  submitZipCode(e){
  //  console.log('submitting zipcode');
    e.preventDefault();
    const { onSubmit } = this.props; //pull out to call method it is linked to
    onSubmit(this.state.zipcode);
    this.setState({isOpen:false});
  }

  zipcodeChange(e){
    this.setState({zipcode: e.target.value});
  }

  render(){
    return(
      <div>
        <Modal isOpen={this.props.isOpen} toggle={this.toggle} className={this.props.className}>
          <ModalHeader toggle={this.toggle}>ZipCode</ModalHeader>
          <ModalBody>
           <form  onSubmit={this.submitZipCode}>
               <label>Zip Code</label>
               <input
                 type="input"
                 name="zipcode"
                 value={this.state.zipcode}
                 onChange={this.zipcodeChange}
                />
              <Button color="primary" type="submit" className='btn btn-success'>Submit</Button>
            </form>
          </ModalBody>
        </Modal>
      </div>

    );
  }
}

export default ZipCode;
...