Получить модальный режим для запуска из родительского компонента

#reactjs

#reactjs

Вопрос:

Здесь вопрос новичка. Как мне запустить компонент переключения модального параметра из родительского компонента? Я хочу, чтобы модал открывался при нажатии кнопки на родительском компоненте. Кнопка отправит форму, и как только форма будет отправлена, я хочу, чтобы модал запустился. Я пытаюсь запустить его в function handleSubmit(e)

Дочерний компонент: Modal.jsx

 class ModalExample extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      modal: false
    };

    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    this.setState(prevState => ({
      modal: !prevState.modal
    }));
  }

  render() {
    return (
      <div>
        <Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
          <ModalHeader toggle={this.toggle}>Modal title</ModalHeader>
        </Modal>
      </div>
    );
  }
}
  

Путь: Parent.jsx

 export default function ForgotPassword() {
  function handleSubmit(e) {
    e.preventDefault();
  }

  return (
    <div className="container h-100">
      <ModalExample toggle />
      <button onClick={this.handleSubmit}>Open modal</button>
    </div>
  );
}
  

Комментарии:

1. вам нужно использовать ссылки

2. Не могли бы вы, пожалуйста, показать мне, что вы имеете в виду.

Ответ №1:

Ссылки можно использовать следующим образом

 export default function ForgotPassword() {
      function handleSubmit(e) {
        e.preventDefault();
      }

      return (
        <div className="container h-100">
          <ModalExample  ref={instance => { this.child = instance; }}  />
          <button onClick={() => { this.child.toggle(); }}>Open modal</button>
        </div>
      );
    }
  

Ответ №2:

Могли бы быть способы получше, но способ, которым я это сделал, заключается в том, что я перенес функцию переключения в родительский класс и передал как функцию, так и значение состояния в modal в props.

Затем вы можете вызвать эту функцию props в своем модале, чтобы переключить его отображение, хотя это превратит ваш чистый компонент в компонент с отслеживанием состояния.

Дочерний компонент: Modal.jsx

 class ModalExample extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <div>
        <Modal isOpen={this.props.modal} toggle={this.props.toggle} className={this.props.className}>
          <ModalHeader toggle={this.props.toggle}>Modal title</ModalHeader>
        </Modal>
      </div>
    );
  }
}
  

Родительский: Parent.jsx

 class ForgotPassword() extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      modal: false
    };
    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    this.setState(prevState => ({
      modal: !prevState.modal
    }));
  }

  return (
    <div className="container h-100">
      <ModalExample toggle={this.toggle} modal={this.state.modal} />
      <button onClick={this.handleSubmit}>Open modal</button>
    </div>
  );
}
  

Комментарии:

1. Да, я думал об этом. Это просто кажется повторяющимся. Если я использую модель в нескольких местах, я предполагаю, что лучше сохранить логику для модели в модальном компоненте.

2. Да, ответ Джибина также выглядит более чистым, я бы принял его.