Откройте модал из другого компонента в React bootstrap

#javascript #reactjs #react-native

Вопрос:

Я пытаюсь открыть модал из другого компонента. это в моем родительском компоненте:

 import { Button, Modal } from 'react-bootstrap';
import React, { useState } from 'react';
import './App.css';
import ModalB from './ModalB';

function App() {
  const [showA, setShowA] = useState(false);
  const [showB, setShowB] = useState(false);

  const handleCloseA = () => setShowA(false);
  const handleShowA = () => setShowA(true);

  const handleShowB = ({ handleShow }) => {
    setShowB(handleShow);
  };


  return (
    <div className="App">
      <header className="App-header">

        <Button variant="primary" onClick={handleShowA}>Open A</Button>
        <Button variant="primary" onClick={handleShowB}>Open B</Button>

        <Modal show={showA} onHide={handleCloseA}>
          <Modal.Header closeButton>
            <Modal.Title>In Modal A</Modal.Title>
          </Modal.Header>
        </Modal>

        <ModalB isModalVisible={showB}></ModalB>

      </header>
    </div>
  );
}

export default App;
 

И Модальный компонент B:

 import { Button, Modal } from 'react-bootstrap';
import React, { useState } from 'react';
import { propTypes } from 'react-bootstrap/esm/Image';

const ModalB = (props) => {
    const [showB, setShowB] = useState(false);
    const handleCloseB = () => setShowB(false);
    const handleShowB = () => setShowB(true);

    return (
        <div>
            <Modal show={props.isModalVisible} onHide={handleCloseB}>
                <Modal.Header closeButton>
                    <Modal.Title>In Modal B</Modal.Title>
                </Modal.Header>
            </Modal>
        </div>
    );

}

export default ModalB;
 

Проблема заключается в отображении B из основного компонента. Хотя отображение модалы простое, я не понимаю, как указать B для отображения из основного компонента.

Спасибо за вашу помощь.

Ответ №1:

Удалите состояние «показать» ModalB и передайте handleShowB обработчик от родителя.

 const ModalB = ({ isModalVisible, handleShowB }) => {
  return (
    <div>
      <Modal show={props.isModalVisible} onHide={handleShowB}>
        <Modal.Header closeButton>
          <Modal.Title>In Modal B</Modal.Title>
        </Modal.Header>
      </Modal>
    </div>
  );
}
 

В родительском handleShowB обработчике передачи. Здесь мы просто передаем анонимный обратный вызов, чтобы вызвать setShowB средство обновления состояния и обновить showB состояние до ложного.

 <ModalB
  isModalVisible={showB}
  handleShowB={() => setShowB(false)}
/>
 

Ответ №2:

const handleShowB = ({ handleShow }) => { setShowB(handleShow); };

Зачем вам это нужно handleShow , если это не определено?

Просто обновите свое состояние на основе текущего состояния, и остальная часть вашего кода будет работать нормально.

 const handleShowB = () => setShowB(!showB);
 

Это вызовет текущее модальное состояние (скрытие/отображение погоды) для ModalB компонента, и он будет отображаться соответствующим образом.

Вот рабочая демонстрация: https://codesandbox.io/s/show-multiple-modals-edv6y