Dev/React

[React] #7.4 Movie App part Two

코딩삐약 2022. 6. 14. 14:25

App.js

import { useEffect, useState } from 'react';
import Movie from './components/Movie';

function App() {
  return null; //router를 render함 
  //-> router는 URL을 보고있는 component고
  //URL이 localhost면 Home.js , /movies/122 이면 Detail.js을 보여주는 식
}
export default App;

 

/routes/Home.js

import { 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( //then과 같은 await
        `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>: //Movie.js 컴포넌트로 빼서 변경
        movies.map(movie => ( //key는 React.js에서만, map안에서 component들을 render할 때 꼭 필요함
        // Movie component로 properties 보내기
        <Movie key={movie.id} coverImg={movie.medium_cover_image} title={movie.title} summary={movie.summary} genres={movie.genres}/>
      ))}
    </div>
  );
}
export default Home;

 

/components/Movie.js

import PropTypes from "prop-types";

// parent 컴포넌트로부터 movie 컴포넌트가 받아오는 property들
function Movie({ coverImg, title, summary, genres }) {
    return (
    <div>
    <img src={coverImg} alt={title}/>
    <h2>{title}</h2>
    <p>{summary}</p>
    <ul>
      {genres.map((g)=>
        <li key={g}>{g}</li>
      )}
    </ul>
  </div>
  );
}
//propertis의 타입 설정
Movie.propTypes = {
    coverImg: PropTypes.string.isRequired,
    title: PropTypes.string.isRequired,
    summary: PropTypes.string.isRequired,
    genres: PropTypes.arrayOf(PropTypes.string).isRequired
}

export default Movie;