💡 지금까지 공부한 것들을 응용해서 영화 정보를 보여주는 페이지를 만들어보자!
import { useEffect, useState } from 'react';
function App() {
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)
.then((response) => response.json())
.then((json) => console.log(json));
}, []);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
export default App;
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
useEffect(() => {
fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)
.then((response) => response.json())
.then((json) => {
setMovies(json.data.movies);
setLoading(false);
});
}, []);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
const response = await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`);
const json = await response.json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
const json = await (await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
console.log(movies);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
const json = await (await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
return (
<div>
{loading ? (
<h1>Loading...</h1>
) : (
<div>
{movies.map((movie) => (
<div key={movie.id}>
<img src={movie.medium_cover_image} />
<h2>{movie.title}</h2>
<p>{movie.summary}</p>
{movie.hasOwnProperty('genres') ? (
<ul>
{movie.genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
) : null}
</div>
))}
</div>
)}
</div>
);
}
import { useEffect, useState } from 'react';
import Movie from './Movie';
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
const json = await (await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
return (
<div>
{loading ? (
<h1>Loading...</h1>
) : (
<div>
{movies.map((movie) => (
<Movie
key={movie.id}
coverImg={movie.medium_cover_image}
title={movie.title}
summary={movie.summary}
genres={movie.genres}
/>
))}
</div>
)}
</div>
);
}
App.js
에 Movie.js
를 import해준다.import PropTypes from 'prop-types';
function Movie({ coverImg, title, summary, genres }) {
return (
<div>
<img src={coverImg} alt={title} />
<h2>{title}</h2>
<p>{summary}</p>
<ul>
{genres && genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
Movie.propTypes = {
coverImg: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
summary: PropTypes.string.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
};
export default Movie;
react-route-dom
설치해줘야한다.Route
라는 폴더를 생성해 주었다.components
라는 폴더를 생성해 주었다.import { useEffect, useState } from 'react';
import Movie from './components/Movie';
function App() {
return null;
}
export default App;
import { useEffect, useState } from 'react';
import Movie from '../components/Movie';
function Home() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
const json = await (await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`)).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
return (
<div>
{loading ? (
<h1>Loading...</h1>
) : (
<div>
{movies.map((movie) => (
<Movie
key={movie.id}
coverImg={movie.medium_cover_image}
title={movie.title}
summary={movie.summary}
genres={movie.genres}
/>
))}
</div>
)}
</div>
);
}
export default Home;
function Detail() {
return <h1>Detail</h1>;
}
export default Detail;
import { useEffect, useState } from 'react';
import Movie from './components/Movie';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
// BrowerRouter, HashRouter 2가지 종류가 있는데 HashRouter -> http://localhost:3000/#/movie -> #이 붙는 것이다.
// 컴포넌트 import 까먹지 말기!
import Home from './routes/Home';
import Detail from './routes/Detail';
function App() {
return (
<Router>
<Switch>
<Route path="/movie">
<Detail />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</Router>
);
}
export default App;
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
function Movie({ coverImg, title, summary, genres }) {
return (
<div>
<img src={coverImg} alt={title} />
<h2><Link to="/movie">{title}</Link></h2>
<p>{summary}</p>
<ul>
{genres && genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
Movie.propTypes = {
coverImg: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
summary: PropTypes.string.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
};
export default Movie;
import { useParams } from 'react-router-dom';
function Detail() {
const x = useParams()
console.log(x);
return <h1>Detail</h1>;
}
export default Detail;
import { useEffect } from 'react';
import { useParams } from 'react-router-dom';
function Detail() {
const { id } = useParams();
const getMovie = async () => {
const json = await(await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)).json();
console.log(json);
};
useEffect(() => {
getMovie();
}, []);
return <h1>Detail</h1>;
}
export default Detail;
npm i gh-pages
: 다운로드하기npm run build
하면 build 폴더가 생성된다."deploy": "gh-pages -d build",
"predeploy": "npm run build"
"homepage": "https://yewon97.github.io/react-for-beginners-npx"
npm run deploy
라고 코드를 실행 시키면homepage
주소로 들어가게 되면 배포된 사이트가 나온다.function Movie({ id, coverImg, title, summary, genres }) {
return (
<div>
<img src={coverImg} alt={title} />
<h2><Link to={`/movie/${id}`}>{title}</Link></h2>
<p>{summary.length > 235 ? `${summary.slice(0, 235)}...` : summary}</p>
<ul>
{genres && genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
<p>{summary.length > 235 ?
${summary.slice(0, 235)}... : summary}</p>
...
을 작성해준다.