Реагируйте — Управляйте модалами начальной загрузки в компонентах

#reactjs

Вопрос:

У меня есть приложение ReactJS с 4 экранами/компонентами. Каждый экран может быть связан с другим.

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

На данный момент я просто устанавливаю модальность на своем 1-м компоненте :

 <Modal show={this.state.show}
       ref={this.ModalGlobal}
       onHide={() => this.setState({show: false})}
>
    <Modal.Body>
        {this.state.id amp;amp;
        <MyComponentB id={this.state.id} />
        }
    </Modal.Body>
</Modal>
 

В моем компоненте B я хочу открыть один и тот же модальный файл с другим идентификатором.

Я пытался использовать ссылки, но я не знаю, что с этим делать в моем компоненте B ?

Нравится :

 this.ModalGlobal.current.destroy 
 

Должен ли я использовать Redux или это можно сделать с помощью контекстов или другого решения ?

Ответ №1:

Вместо того, чтобы один модал закрывал другой и открывал его, можно ли было бы вместо этого, чтобы модал обновлял свое собственное содержимое на основе идентификатора? Вы можете создать оболочку для модала, которая обновит тело модала в зависимости от текущего идентификатора. Что-то вроде этого:

 const MyModal = ({id}) => {
  const [modalPage, setModalPage] = useState(id);
  const [modalIsOpen, setModalIsOpen] = useState(false);

  useEffect(() => {
    setModalPage(id)
  }, [id]);

  const openModal = async () => {
    setModalIsOpen(true);
    document.body.style.overflowY = "hidden";
  }

  const closeModal = () => {
    setModalIsOpen(false);
    document.body.style.overflowY = "";
  }

  const modalPages = {
    'welcome': <WelcomeComponent setModalPage />,
    'products': <ProductsComponent setModalPage />,
    'contact': <ContactComponent setModalPage />
  }

  const content = modalPages[modalPage];

  return (
    <Modal
      isOpen={modalIsOpen}
      onRequestClose={closeModal}
      className="react-modal"
      overlayClassName="react-modal-overlay"
    >
      {content}
    </Modal>
  );
}