import { useEffect, useState } from "react"
function App () {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
useEffect(() => {
fetch('https://yts.mx/api/v2/list_movies.json?minimum_rating=8.8&sort_by=year'
)
.then(response => response.json())
.then((json) => {
setMovies(json.data.movies);
setLoading(false);
});
},[])
console.log(movies)
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
export default App;
요새 저 then을 안쓰고 async-await을 쓴다고 한다.
import { useEffect, useState } from "react"
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=8.8&sort_by=year'
);
const json = await response.json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies()
},[]);
console.log(movies)
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
export default App;
좀 더 간단하게 하면
import { useEffect, useState } from "react"
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=8.8&sort_by=year'
)
).json();
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies()
},[]);
console.log(movies)
return (
<div>
{loading ? (
<h1>Loading...</h1>
) : (
<div>
영화 array에서 각각의 영화에 적용
{movies.map(movie => (
<div key = {movie.id}>
<img src={movie.medium_cover_image} />
<h2>{movie.title}</h2>
<p>{movie.summary}</p>
<ul>
장르는 array여서 map한번 더 해줘야함 고유값으로 key설정 필수
{movie.genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
))}
</div>
)}
</div>
);
}
export default App;
import {BrowserRouter as Router,Switch,Route } from "react-router-dom";
import Detail from "./routes/Detail";
import Home from "./routes/Home";
function App () {
return (
<Router>
<Switch>
<Route path="/hello">
<h1>Hello</h1>
</Route>
<Route path="/movie/:id">
<Detail />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</Router>
);
}
export default App;
import PropTypes from "prop-types";
import {Link } from "react-router-dom";
function Movie({id, coverImg, title, summary, genres}) {
return (
<div>
<img src={coverImg} alt={title}/>
<h2>
<Link to ={`/movie/${id}`}>{title}</Link>
</h2>
<p>{summary}</p>
<ul>
{genres.map((g) => (
<li key={g}>{g}</li>
))}
</ul>
</div>
);
}
Movie.propTypes = {
id: PropTypes.number.isRequired,
coverImg: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
summary: PropTypes.string.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
};
export default Movie;
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=8.8&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}
id={movie.id}
coverImg={movie.medium_cover_image}
title={movie.title}
summary={movie.summary}
genres={movie.genres}
/>
))}
</div>
)}
</div>
);
}
export default Home;
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;
};
useEffect(() => {
getMovie();
}, [])
return <h1>Detail</h1>;
}
export default Detail;
git에서 레포지토리 생성하고 push 하는 것은
https://laugh4mile.tistory.com/107
이곳을 참고 했다.
웹사이트 퍼블리싱 하는 것은
packagejson 파일에서 deploy,predeploy,homepage를 추가하면 된다. 좀 기다리면 웹페이지가 뜬다.
{
"name": "moviewebsite",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.3.0",
"@testing-library/user-event": "^13.5.0",
"gh-pages": "^4.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^5.3.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"deploy": "gh-pages -d build",
"predeploy": "npm run build"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"homepage": "https://macang15.github.io/moviewebsite"
}

css는 다음에 하는 것으로!