Как мне отобразить компонент в модальном режиме React

#javascript #reactjs #next.js

#javascript #reactjs #next.js

Вопрос:

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

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

Это мой /accidents маршрут — accidents.js

 export default function Home() {
    const router = useRouter()
    const [isOpen, setIsOpen] = useState(false)
    const [cardsArray, setCards] = useState([])

    const addCard = () => {
        let force = generateForce(100)
        let passagers = generatePassagers()
        let speed = generateSpeed()
        let msg = helpNeeded(force, passagers)

        let newCard = (
            <AccidentCard
                force={force}
                passagers={passagers}
                speed={speed}
                msg={msg}
            />
        )
        console.log(newCard)
        setCards((arr) => [...arr, newCard])
    }

    let cardsList = cardsArray.map((card, idx) => (
        <div key={idx} id={idx}>
            <Link
                href={`/accidents/?accidentNum=${idx}`}
                as={`/accidents/acc.num.${idx   1}`}
            >
                <a>{card}</a>
            </Link>
        </div>
    ))  

    function toggleModal() {
        setIsOpen(!isOpen)
    }

    return (
        <div>
            <button onClick={addCard}>Add more</button>
            <div className={styles.cardsList} onClick={toggleModal}>{cardsList}</div>
            <Link href="/">
                <a>Go back to Home!</a>
            </Link>
            <ReactModal isOpen={isOpen} onRequestClose={toggleModal}>
                <div>Is MODAL OPEN IT WORKS</div>
                <button onClick={toggleModal}>X</button>
            </ReactModal>
        </div>
    )
}
 

И это компонент Card — AccidentCard.js

 const AccidentCard = (props) => {

    return (
        <div className={styles.cardContainer}>
            <p>Possible casualties: {props.passagers}</p>
            <p>Force is: {props.force} Joules</p>
            <p>Speed at impact: {props.speed} km/h</p>
            <p className={styles.help}>{props.msg}</p>
        </div>
    )
}
 

А также иметь этот файл для открытия отдельной страницы для каждой аварии. [accidentNum].js

 export default function AccidentPage() {
  const router = useRouter()
  const {accidentNum} = router.query
 

  return <div>I'm the ACCIDENT {accidentNum}</div>
}
 

Ответ №1:

Я использую встроенный стиль для CSS, вы можете его изменить. Ссылка на Codesandbox

 import { useState } from "react";

export default function IndexPage() {
  const [modalActive, setModalActive] = useState(false);
  return (
    <div>
      <button onClick={() => setModalActive(true)}>Open Card </button>

      {modalActive amp;amp; (
        <ReactModal close={() => setModalActive(false)}>
          <div
            style={{
              width: 100,
              height: 100,
              backgroundColor: "white",
              padding: 20
            }}
          >
            Your Card Component is Here
          </div>
        </ReactModal>
      )}
    </div>
  );
}

function ReactModal({ children, close }) {
  return (
    <div
      style={{
        position: "fixed",
        top: 0,
        left: 0,
        background: "rgba(0, 0, 0, 0.5)",
        display: "flex",
        flexDirection: "row",
        justifyContent: "center",
        alignItems: "center"
      }}
    >
      <div
        style={{
          width: "100vw",
          height: "100vh",
          position: "relative",
          display: "flex",
          flexDirection: "row",
          justifyContent: "center",
          alignItems: "center"
        }}
      >
        {children}
        <button
          onClick={close}
          style={{
            position: "absolute",
            top: 0,
            right: 0,
            marginRight: 10,
            marginTop: 10
          }}
        >
          Close Modal(Maybe put some close icon)
        </button>
      </div>
    </div>
  );
}
 

Я надеюсь, что это поможет. Хорошего дня

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

1. Это то, что мне было нужно. Большое вам спасибо. Еще один вопрос, если вы можете, пожалуйста, помогите. Как я могу закрыть его, если щелкнуть за пределами модального?

2. Приветствую вас. Просто создайте внешний хук. Я думаю, это может сработать для вас codesandbox.io/s/outside-alerter-hooks-lmr2y?module=/src /…