초보자의 입장에서 적은 내용으로, 틀리거나 정확하지 않을 수 있습니다.
[리액트] 노마드코더 영화 추천 앱(Movie App) 복습
공부 기간: 22/03/31 ~ 22/04/01
1. App.js
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import "./App.css";
import Detail from "./routes/Detail";
import Home from "./routes/Home";
export default function App() {
return (
<Router>
<Routes>
<Route path="movie/:id" element={<Detail />} />
<Route path="/" element={<Home />} />
</Routes>
</Router>
);
}
2. movie.js
import { Link } from "react-router-dom";
export default function Movie(props) {
return (
<div className="box">
<h3>
{props.id} {props.title}{" "}
</h3>
<img src={props.image} />
<p>{props.url}</p>
<p>{props.summary.length > 100 ? props.summary.slice(0,100) + "... more" : props.summary}</p>
<Link to={`/movie/${props.id}`} style={{ color: "white" }}>
자세히보기
</Link>
</div>
);
}
3. Detail.js
import { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
export default function Detail() {
const { id } = useParams();
// 현재 페이지의 마지막 부분을 id로 받아온다.
const [movie, setMovie] = useState();
const [loading, setLoading] = useState(true);
const getMovie = async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
setMovie(json.data.movie);
setLoading(false);
};
useEffect(getMovie, []);
return (
<>
{loading ? (
"loading..."
) : (
<div className="box">
<h1>{movie.title}</h1>
<div>
<img src={movie.medium_cover_image}></img>
</div>
<div style={{textAlign:"center"}}>rating: {movie.rating} | year:{movie.year} | runtime : {movie.runtime} | genres: {movie.genres.map((genre) => genre+", ")} </div>
<h5>{movie.description_full}</h5>
</div>
)}
</>
);
}
4. Home.js
import { useState, useEffect } from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Movie from "../components/movie"
export default function Home() {
const [data, setData] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(
"https://yts.mx/api/v2/list_movies.json?minimum_rating=8.8&sort_by=year"
)
.then((res) => res.json())
.then((json) => {
setData(json.data.movies);
setLoading(false);
});
}, []);
return (
<div className="allbox">
{loading
? "loading"
: data.map((item) => (
<Movie
key={item.id}
id={item.id}
title={item.title}
image={item.medium_cover_image}
summary={item.summary}
/>
))}
</div>
);
}
비고
이 앱을 만들기 위해 useParams, grid css, async await, react-router 의 개념을 복습해야했다.
처음 배울 땐 리액트 라우터 돔 v5.3 을 통해 배웠으나, v6로 한번 다시 만들어봤다.
react-router : https://velog.io/@soryeongk/ReactRouterDomV6
[React] react-router-dom v6 업그레이드 되면서 달라진 것들
react-router-dom이 v6으로 업그레이드 되었습니다 :) v5와 다른 점이 몇 가지 있으니 꼭 숙지하시기 바랍니다. 안그럼 아무것도 실행되지 않을지도....
velog.io
grid css : https://studiomeal.com/archives/533
이번에야말로 CSS Grid를 익혀보자
이 포스트에는 실제 코드가 적용된 부분들이 있으므로, 해당 기능을 잘 지원하는 최신 웹 브라우저로 보시는게 좋습니다. (대충 인터넷 익스플로러로만 안보면 된다는 이야기) 이 튜토리얼은 “
studiomeal.com
useParams : https://think0wise.tistory.com/6
react - useParams
검색을 통해 react router-dom 의 hook 이란것을 알게되었다. URL의 parameter 문법이란다. 내 경우엔 상품의 detail을 보여주는 페이지가 여러개 필요했는데 요럴때 쓰면 딱이다. (판매상품의 수 만큼 필요,
think0wise.tistory.com
async await : https://joshua1988.github.io/web-development/javascript/js-async-await/
자바스크립트 async와 await
(중급) 자바스크립트 개발자를 위한 async, await 사용법 설명. 쉽게 알아보는 자바스크립트 async await 개념, 사용법, 예제 코드, 예외 처리 방법
joshua1988.github.io
'강의 정리 > 기타 강의 정리' 카테고리의 다른 글
[Git] 2. 시간 여행하기 (0) | 2022.10.17 |
---|---|
[Git] 1. 시작하기 (0) | 2022.10.17 |
[리액트] 노마드코더 투두리스트(Todo list) 복습 (0) | 2022.03.31 |
[리액트] 노마드코더 코인트래커(Coin Tracker) 복습 (1) | 2022.03.31 |
[리액트] 노마드코더 거리변환기(Km to Miles) 복습 (0) | 2022.03.30 |