#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 /…