Row 컴포넌트 내에서 영화를 클릭하면 해당 영화의 상세정보 페이지를 모달로 노출시키고자 한다. 이를 위해, 첫번째로 Row 컴포넌트에서 해야할 작업(state, event handler)과 두번째, Row 컴포넌트에서 props로 전달 받은 영화 정보를 토대로 모달 컴포넌트의 구조를 작성 해야하는지 살펴보겠다.
const [modalOpen, setModalOpen] = useState(false);
const [movieSelected, setMovieSelected] = useState({});
// src > components > Row.js
const [modalOpen, setModalOpen] = useState(false);
const [movieSelected, setMovieSelected] = useState({});
...
const ModalhadleClick = (movie) => {
setModalOpen(true);
setMovieSelected(movie);
console.log("handledMovie", movie);
};
...
...
<RowPosters id={id}>
{movies.map((movie) => (
<img
key={movie.id}
className="row__poster"
src={`https://image.tmdb.org/t/p/original/
${movie.backdrop_path}`}
alt={movie.name}
onClick={() => ModalhadleClick(movie)}
/>
))}
</RowPosters>
```
row컴포넌트 내에 img el를 클릭 했을 때, 다음과 같은 과정이 수행된다.
1) onClick 이벤트 발생하면서, movie state를 인자로 전달받은 ModalhadleClick 함수가 호출된다.
2) ModalhadleClick 함수가 호출되면서, 다음 두 개의 state를 변경시킨다.
3) modalOpen state가 true일 때, MovieModal 컴포넌트가 마운팅 되도록 설정한다.
{modalOpen && ( <MovieModal />)}
4) MovieModal 컴포넌트에 필요한 아래 두가지 props를 전달한다.
{modalOpen && (
<MovieModal setModalOpen={setModalOpen} {...movieSelected} />
)}
import React from "react";
import { ModalContent, ModalWrapper, Presentation } from "./MovieModal.styled";
const MovieModal = ({
backdrop_path,
title,
overview,
name,
release_date,
first_air_date,
vote_average,
setModalOpen,
}) => {
return (
<Presentation role="presentation">
<ModalWrapper>
<div className="modal">
<span className="modal__close" onClick={() => setModalOpen(false)}>
X
</span>
<img
className="modal__poster-img"
src={`https://image.tmdb.org/t/p/original/${backdrop_path}`}
alt="modal-img"
/>
<ModalContent>
<p className="modal__details">
<span className="modal__user_perc">100% for you</span>{" "}
{/* 개봉일자 혹은 첫 상영일자 */}
{release_date ? release_date : first_air_date}
</p>
<h2 className="modal__title">{title ? title : name}</h2>
<p className="modal__overview">평점: {vote_average}</p>
<p className="modal__overview">{overview}</p>
</ModalContent>
</div>
</ModalWrapper>
</Presentation>
);
};
export default MovieModal;