[React] Movie app clone coding : Updating Component
7-1. Updating Component
정보확인 및 업데이트
요소 검사를 통해서 movie DB에서 어떤 종류의 정보를 받고 있는지 파악한다.
1// App.js
2_renderMovies = () => {
3 const movies = this.state.movies.map((movie, index) => {
4 console.log(movie) // 정보를 프린트
5 ...
6}
Console에 받아오는 정보가 출력된 것을 확인할 수 있다. 받아오는 정보 중에 포스터, 제목, 장르, 평점, 설명 등이 필요하다.
- 제목 :
title-english
- 포스터 :
small_cover_image
- 장르 :
genres
- 평점 :
rating
- 설명 :
synopsis
받아오는 정보를 아래와 같이 수정한다.
1// App.js
2_renderMovies = () => {
3 const movies = this.state.movies.map((movie, index) => {
4 console.log(movie)
5 return <Movie
6 title={movie.title_english}
7 poster={movie.medium_cover_image}
8 key={movie.id}
9 genres={movie.genres}
10 synopsis={movie.synopsis}
11 />
12 })
13 return movies
14}
Movie component에 props를 업데이트 한다.
1// Movie.js
2Movie.propTypes = {
3 title: propTypes.string.isRequired,
4 poster: propTypes.string.isRequired,
5 genres: propTypes.array.isRequired,
6 synopsis: propTypes.string.isRequired
7}
HTML 꾸미기
1// Movie.js
2import React from 'react';
3import propTypes from 'prop-types';
4import './Movie.css';
5
6function Movie({title, poster, genres, synopsis}){
7 return(
8 <div className="Movie">
9 <div className="Movie__Columns">
10 <MoviePoster poster={poster} alt={title} />
11 </div>
12 <div className="Movie__Columns">
13 <h1>{title}</h1>
14 <div className="Movie__Genres">
15 {genres.map((genre, index) => <MovieGenre genre={genre} key={index} />)}
16 </div>
17 <p className="Movie__Synopsis">
18 {synopsis}
19 </p>
20
21 </div>
22 </div>
23 )
24}
25
26function MoviePoster({poster, alt}) {
27 return(
28 <img src={poster} alt={alt} title={alt} className="Movie__Poster" />
29 )
30}
31
32
33function MovieGenre({genre}){
34 return(
35 <span className="Movie__Genre">{genre}</span>
36 )
37}
38
39
40Movie.propTypes = {
41 title: propTypes.string.isRequired,
42 poster: propTypes.string.isRequired,
43 genres: propTypes.array.isRequired,
44 synopsis: propTypes.string.isRequired
45}
46
47MoviePoster.propTypes = {
48 poster: propTypes.string.isRequired,
49 alt: propTypes.string.isRequired
50}
51
52MovieGenre.prototype ={
53 genre: propTypes.string.isRequired
54}
55
56export default Movie;
1// App.js
2import React, { Component } from 'react';
3import './App.css';
4import Movie from './Movie';
5
6class App extends Component {
7
8 state = {}
9
10 componentDidMount(){
11 this._getMovies(); // 큰 사이즈의 componentDidMount를 갖고 싶지 않으므로
12 }
13
14 _renderMovies = () => {
15 const movies = this.state.movies.map((movie, index) => {
16 return <Movie
17 title={movie.title_english}
18 poster={movie.medium_cover_image}
19 key={movie.id}
20 genres={movie.genres}
21 synopsis={movie.synopsis}
22 />
23 })
24 return movies
25 }
26
27 _getMovies = async() => {
28 const movies = await this._callApi()
29 this.setState({
30 movies
31 })
32 }
33
34
35 _callApi = () => {
36 return fetch('https://yts.am/api/v2/list_movies.json?sort_by=rating')
37 .then(response => response.json())
38 .then(json => json.data.movies)
39 .catch(err => console.log('error'))
40 }
41
42
43 render() {
44 return (
45 <div className="App">
46 {this.state.movies ? this._renderMovies() : 'Loading'}
47 </div>
48 );
49 }
50}
51
52export default App;