movie app 프로젝트 시작
function App() {
const [] = useState();
const [loading, setLoading] = useState(ture);
useEffect(() => {
fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9.0&sort_by=year`)
.then((response)=>response.json())
.then((json) => console.log(json));
},[]);
return (
<div>
{loading ? <h1>Loading...</h2> : null}
</div>
)
}
function App() {
const [movies, setMovies] = useState([]); <<<----
const [loading, setLoading] = useState(ture);
useEffect(() => {
fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9.0&sort_by=year`)
.then((response)=> response.json())
.then((json) => {
setMovies(json.data.movies); <<<----
setLoading(false);
});
},[]);
return (
<div>
{loading ? <h1>Loading...</h2> : null}
</div>
)
}
json.data.movies
을 담을 movies
state 를 만들고,setMovies
로 값을 넣어줬다.then()
대신 유투브 클론코딩을 만들었을 때 사용한 async-await
을 사용해주자function App() {
const [movies, setMovies] = useState([]);
const [loading, setLoading] = useState(ture);
const getMovies = async() => { <<<----
const json = await ( <<<----
awiat fetch(
`https://yts.mx/api/v2/list_movies.json?minimum_rating=9.0&sort_by=year`
)).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies(); <<<----
},[]);
return (
<div>
{loading ? <h1>Loading...</h2> : null}
</div>
)
};
await
을 감싸는 또 다른 await
const getMovies = async ) => {
const response = await fetch (`...`);
const json = await response.json();
setMovies(json.data.movies);
setLoaidng(false);
movies
obj에 있는 내용을 화면에 보이도록 하자.map()
함수를 사용하면 된다.return (
<div>
{loading ? ( <h1>Loading...</h1> ) : (
<div>
{movies.map((movie) =>
<div key={movie.id}>
// 모든 영화들이 가지고 있는 고유 'id'
<img src={movie.medium_cover_image} />
<h2>{movie.title}</h2>
<p>{movie.summary}</p>
<ul>
{movie.genres.map((g) =>
<li key={g}>{g}</li>
// movie.genres 가 obj 형식이므로 또 map을 사용
// key 의 경우, ID 등 어떠한 고유값이 없어
// key 값에 g를 줌
</ul>
</div>
)
</div>
</div>;
)
강의는 v5.3.0 버전으로 진행됬지만, 최신 버전으로 하는게 더 낫겠다 싶어 최신 버전으로 설치
설치 npm i react-router-dom
사용하기 전 import
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Home from './routes/Home';
import Detail from './components/Detail';
function App()
path="/Web/:id"
에서 path=":id"
로, 상대경로로 지정// -App.js
improt Home from "./routes/Home";
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/movie" element={<Detail />} />
</Routes>
</Router>
);
}
Router
: route를 찾고(ex-localhost:3000/movies/123),<Home />
+ <Movie />
<Link to="이동할 주소">Home</Link>
// - Movie.js 컴포넌트
function Movie({
id,
coverImg,
title,
year,
rating,
genres,
runtime }) {
// Movie 컴포넌트의 부모 컴포넌트인 Home 에서 받아온 props
return (
<div className="header">
<img src={coverImg} alt={title} />
<div className="title-warp">
<div className="title">
<Link to={`/movie/${id}`}> <<<----
{title} ({year})
</Link>
</div>
...
} // end Movie
Movie.propTypes = {
id: PropTypes.number.isRequired,
coverImg: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
year: PropTypes.number.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
rating: PropTypes.number,
runtime: PropTypes.number,
};
<Link to={'/movie/${id}'}>
의 ${id}
)function Detail() {
const { id } = useParams();
// → url 에 있는 변수의 값을 가져온다. /:{변수}
// 이름은 변수에 지정한 값으로 설정됨
// 즉, <Link to={'/movie/${id}'}>에서 설정했던 변수명을 사용
}
function Detail() {
const { id } = useParams();
const getMovies = async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
setDetail(json.data.movie);
setLoading(false);
};
useEffect(() => {
getMovies();
}, [getMovies]);