반응형
import { BrowserRouter as Router , Switch , Route, Link } from "react-router-dom";
import Detail from "./routes/Detail";
import Home from "./routes/Home";
function App() {
return (
<Router>
<Switch>
<Route path="/movie/:id">
<Detail />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</Router>
);
}
export default App;
import { useEffect, useState } from 'react';
import Movie from '../components/Movie'
function MovieList(props) {
return (
<div>
{props.movies.map((movie) => (
<Movie
key={movie.id}
id={movie.id}
coverImage={movie.medium_cover_image}
title={movie.title}
summary={movie.summary} />
))}
</div>
);
}
function Home() {
const [isLoading, setIsLoading] = 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);
setIsLoading(false);
};
useEffect(() => {
getMovies();
}, [movies]);
return (
<div>
<h1>Movie List</h1>
{isLoading ? <strong>Loading...</strong> : <MovieList movies={movies} />}
</div>
);
}
export default Home;
import Card from 'react-bootstrap/Card';
import PropTypes from 'prop-types';
import {Link} from 'react-router-dom';
function Movie({id, coverImage, title, summary}) {
return (
<div>
<Card style={{
width: '18rem',
shadowColor: '#470000',
shadowOffset: {width: 0, height: 1},
shadowOpacity: 0.2,
elevation: 1
}}>
<Card.Img variant="top" src={coverImage} />
<Card.Body>
<h2>
<Link to={`/movie/${id}`}>{title}</Link>
</h2>
<Card.Text>{summary}</Card.Text>
</Card.Body>
</Card>
<br />
</div>
);
}
Movie.prototype = {
coverImage: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
summary : PropTypes.string.isRequired
};
export default Movie;
import { useEffect, useState } from "react";
import {useParams} from "react-router-dom";
function Detail() {
const {id} = useParams();
const [title , setTitle] = useState("");
const [description , setDescription] = useState("");
const [coverImageUrl , setCoverImageUrl] = useState("");
const getMovieDetail = async () => {
const response = await fetch(
`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`,
);
const json = await response.json();
setTitle(json.data.movie.title);
setDescription(json.data.movie.description_full);
setCoverImageUrl(json.data.movie.large_cover_image)
};
useEffect(() => {
getMovieDetail();
}, [id]);
return (
<div>
<h1>Detail Page</h1>
<h2>{title}</h2>
<img src={coverImageUrl}/>
<p>{description}</p>
</div>
);
}
export default Detail;
반응형
'[====== Development ======] > React' 카테고리의 다른 글
uuid값 생성하기 (0) | 2022.03.16 |
---|---|
이미지 파일 선택하여 Preview 출력 (0) | 2022.03.16 |
Rounded Input textbox (0) | 2022.01.11 |
[React Study] Movie List (0) | 2022.01.11 |
[React Study] CoinTracker (0) | 2022.01.08 |