[第六章]インポートモードと画像
ムービーをリストするためのRow構成部品の作成
row componentを適用します.jsでまず5つ取りましょう
function App() {
return (
<div className="App">
<Nav />
<Banner/>
<Row
title="NETFLIX ORIGINALS"
id="NO"
fetchUrl={requests.fetchNetflixOriginals}
isLargeRow
/>
<Row
title="Trending Now"
id = "TN"
fetchUrl={requests.fetchTrending}
/>
<Row
title="Top Rated"
id = "TR"
fetchUrl={requests.fetchTopRated}
/>
<Row
title="Action Movies"
id = "AM"
fetchUrl={requests.fetchActionMovies}
/>
<Row
title="Comnedy Movies"
id = "CM"
fetchUrl={requests.fetchComedyMovies}
/>
</div>
);
}
このようにしてRowを5個作りますisLargeLowとは一番前に出てくる大物のこと.
公開されたPropsを受け入れる
import React from 'react'
export default function Row({isLarge, title, id, fetchUrl}) {
return <div></div>
}
ムービー情報の取得
import React, { useEffect, useState } from 'react'
import axios from '../api/axios';
export default function Row({isLargeLow, title, id, fetchUrl}) {
const [movies, setMovies] = useState([]);
useEffect(()=>{
fetchMovieData();
},[]);
const fetchMovieData = async () => {
const request = await axios.get(fetchUrl);
setMovies(request.data.results);
}
return <div></div>
}
このように持ってきてください.UIの作成
return(
<section>
<h2>{title}</h2>
<div className='slider'>
<div className='slider__arrow-left'>
<span className='arrow'>{"<"}</span>
</div>
<div id={id} className="row_posters">
{movies.map(movie => (
<img
key={movie.id}
className={`row__poster ${isLargeRow && "row__posterLarge"}`}
src={`https://image.tmdb.org/t/p/original/${isLargeRow ? movie.poster_path: movie.backdrop_path}`}
alt={movie.name}
/>
))}
<div className='slider__arrow-right'>
<span className='arrow'>{">"}</span>
</div>
</div>
</div>
</section>
)
こうしてUIが生成される.こいつのせいで、横に並んでいられなかった.
マットを1つ追加して、死ぬべきだ......もう直った以上、スライド機能を追加しましょう.
スライド機能の追加
矢印の方向をクリックしたときのスライド機能
innerwidth
scrollLeft
使用
<span
className='arrow'
onClick={()=>{
document.getElementById(id).scrollLeft -= window.innerWidth - 80;
}}>
矢印ボタンをクリックするたびに、移動させてください! <div className='slider__arrow-left'>
<span
className='arrow'
onClick={()=>{
document.getElementById(id).scrollLeft -= window.innerWidth - 80;
}}
>
{"<"}
</span>
</div>
<div id={id} className="row__posters">
{movies.map((movie) => (
<img
key={movie.id}
className={`row__poster ${isLargeRow && "row__posterLarge"}`}
src={`https://image.tmdb.org/t/p/original/${isLargeRow ? movie.poster_path: movie.backdrop_path}`}
loading ="lazy"
alt={movie.name}
/>
))}
</div>
<div className='slider__arrow-right'>
<span
className='arrow'
onClick={()=>{
document.getElementById(id).scrollLeft += window.innerWidth - 80;
}}
>{">"}</span>
</div>
右側にプラス記号を行けばいいです.これで書くことに成功しました.
Styled componentを使用したFooterの作成
この部分を作ろう
import React from "react";
import styled from "styled-components";
export default function Footer() {
return (
<FooterContainer>
<FooterContent>
<FooterLinkContainer>
<FooterLinkTitle>넷플릭스 대한민국</FooterLinkTitle>
<FooterLinkContent>
<FooterLink href="https://help.netflix.com/ko/node/412">
넷플릭스 소개
</FooterLink>
<FooterLink href="https://help.netflix.com/ko">
고객 센터
</FooterLink>
<FooterLink href="https://help.netflix.com/ko/">
미디어 센터
</FooterLink>
<FooterLink href="https://help.netflix.com/ko/">
이용 약관
</FooterLink>
<FooterLink href="https://help.netflix.com/ko/node/412">
자막 및 설정
</FooterLink>
<FooterLink href="https://help.netflix.com/ko">
음성 지원
</FooterLink>
<FooterLink href="https://help.netflix.com/ko/">
기프트카드
</FooterLink>
<FooterLink href="https://help.netflix.com/ko/">
쿠키 설정
</FooterLink>
</FooterLinkContent>
<FooterDescContainer>
<FooterDescRights>
Netflix Rights Reserved.
</FooterDescRights>
</FooterDescContainer>
</FooterLinkContainer>
</FooterContent>
</FooterContainer>
);
}
const FooterContainer = styled.div`
display: flex;
justify-content: center;
align-items: center;
padding: 40px 0;
border-top: 1px solid rgb(25, 25, 25);
width: 100%;
position: relative;
z-index: 100;
@media (max-width: 769px) {
padding: 20px 20px;
padding-bottom: 30px;
}
`;
const FooterContent = styled.div``;
const FooterLinkContainer = styled.div`
width: 500px;
@media (max-width: 768px) {
width: 100%;
}
`;
const FooterLinkTitle = styled.h1`
color: gray;
font-size: 17px;
`;
const FooterLinkContent = styled.div`
display: flex;
justify-content: space-bewteen;
flex-wrap: wrap;
margin-top: 35px;
@media (max-width: 768px) {
margin-top: 26px;
}
`;
const FooterLink = styled.a`
color: gray;
font-size: 14px;
width: 110px;
margin-bottom: 21px;
text-decoration: none;
&:hover {
text-decoration: underline;
}
@media (max-width: 768px) {
margin-bottom: 16px;
}
`;
const FooterDescContainer = styled.div`
margin-top: 30px @media (max-width: 768px) {
margin-top: 20px;
}
`;
const FooterDescRights = styled.h2`
color: white;
font-size: 14px;
text-align: center;
`;
ちょっと長いけど…styled構成部品でFooterを作成します.ムービーの詳細をクリックしてモードを作成
import React, { useEffect, useState } from 'react'
import axios from '../api/axios';
import MovieModal from './MovieModal';
import "./Row.css";
export default function Row({isLargeRow, title, id, fetchUrl}){
const [movies, setMovies] = useState([]);
const [modalOpen, setmodalOpen] = useState(false);
const [movieSelected, setMovieSelected] = useState({});
useEffect(() => {
fetchMovieData();
},[fetchUrl]);
const fetchMovieData = async () => {
const request = await axios.get(fetchUrl);
setMovies(request.data.results);
};
const handleClick = (movie) =>{
setmodalOpen(true) //모달 오픈이 트루
setMovieSelected(movie);
}
return(
<section className="row">
<h2>{title}</h2>
<div className='slider'>
<div
className='slider__arrow-left'
onClick={()=>{ //스크롤 기능(완)
document.getElementById(id).scrollLeft -= window.innerWidth - 80;
}}>
<span
className='arrow'
>
{"<"}
</span>
</div>
<div id={id} className="row__posters">
{movies.map((movie) => (
<img
key={movie.id}
className={`row__poster ${isLargeRow && "row__posterLarge"}`}
src={`https://image.tmdb.org/t/p/original/${isLargeRow ? movie.poster_path: movie.backdrop_path}`}
loading ="lazy"
alt={movie.name}
onClick={()=> handleClick(movie)}
/>
))}
</div>
<div
className='slider__arrow-right'
onClick={()=>{ //스크롤 기능(오)
document.getElementById(id).scrollLeft += window.innerWidth - 80;
}}>
<span
className='arrow'
>{">"}</span>
</div>
</div>
{
modalOpen && ( //모달 오픈시
<MovieModal {...movieSelected} setmodalOpen={setmodalOpen} /> //컴포넌트 가져오기
)
}
</section>
)
}
これにより、モードを開いたときに構成部品をインポートできます.次に、Movie Modal UIを作成します.
Movie Modal UIの作成
UIの作成
index.次のようにjsを作成します.
import React from 'react';
import "./MovieModal.css";
function MovieModal({
backdrop_path,
title,
overview,
name,
release_date,
first_air_date,
vote_average,
setModalOpen
}){
return <div className="presentation">
<div className='wrapper-modal'>
<div className='modal'>
<span onClick={()=> setModalOpen(false)} className='modal-close'>
X
</span>
<img
className='modal__poster-img'
src={`https://image.tmdb.org/t/p/original/${backdrop_path}`}
alt="modal__poster-img"
/>
<div className='modal__content'>
<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>
</div>
</div>
</div>
</div>;
}
export default MovieModal;
これで月が昇る
Reference
この問題について([第六章]インポートモードと画像), 我々は、より多くの情報をここで見つけました https://velog.io/@seochan99/chapter-6모달-및-이미지-불러오기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol