[FrontEnd6] yts-movie-api를 사용하여 영화 리스트 만들기 (yts-api, axios, pagination)

SMALL

안녕하세요~ 보라해바라기입니다:)

 

저는 코딩 학원 마지막 수업을 듣고 있는데요 ㅎㅎ

 

프로젝트를 만드는 수업이라 오늘은 제가 만든 프로젝트를 보여드리려 합니다 ㅎㅎ (아주 작긴 하지만)

 

대략의 내용은 axios, pagination, yts-api를 사용하여 영화 리스트를 만드는 것입니다!

 

1. App.js

import axios from 'axios';
import { Component } from 'react';
import './App.css';
import MovieList from './components/MovieList.js'
import Pagination from './components/Pagination.js';

class App extends Component {
  constructor(props){
    super(props)
    this.state={
      movieList:[],
      currentPage:1,
      movieListPerPage:3
    }
  }

  // axios로 yts-movie data 가져오기
  componentDidMount(){
    this.getMovies()
  }

  getMovies=async()=>{
    const {data : {data : {movies}}} 
    = await axios.get("https://yts.mx/api/v2/list_movies.json")
    this.setState({movieList:movies})
    console.log(movies)
  }

  //pagination
  setCurrentPage=(page)=>{
    alert("페이지 설정(App.js):"+page)
    this.setState({
      currentPage:page
    })
  }

  currentMovieList=(movieList)=>{
    const {currentPage, movieListPerPage} = this.state
    const indexOfFirst = (currentPage-1)*movieListPerPage
    const indexOfLast = indexOfFirst+movieListPerPage
    const slicedMovieList = movieList.slice(indexOfFirst, indexOfLast)
    return slicedMovieList;
  }

  render(){
    const {movieList, movieListPerPage, currentPage} = this.state
    return (
      <div id="App">
        <MovieList movieList={this.currentMovieList(movieList)}/>
        <Pagination movieListLength={movieList.length}
        movieListPerPage={movieListPerPage} currentPage={currentPage}
        setCurrentPage={this.setCurrentPage}/>
      </div>
    );
  }
}

export default App;

 

2. App.css

#App {
  width: 1000px;
  height: 1300px;
  margin: 0 auto;
  background-color: thistle;
}

 

3. Movie.js

import { Component } from 'react';
import '../css/Pagination.css';

class Pagination extends Component {
  constructor(props){
    super(props)
    this.state={
    
    }
  }

  setCurrentPage=(page)=>{
    alert(page+"페이지 클릭(Pagination.js)")
    this.props.setCurrentPage(page)
  }

  prevPage=()=>{
    alert("이전")

    const {currentPage, setCurrentPage} = this.props
    if (currentPage==1){
        alert("여기는 첫 페이지 입니다.")
        return
    }
    setCurrentPage(currentPage-1)
  }

  nextPage=()=>{
    alert("다음")

    const {currentPage, setCurrentPage} = this.props
    const {lastPageNum} = this.state

    if (currentPage+1 > lastPageNum){
        alert("여기는 마지막 페이지 입니다.")
        return
    }
    setCurrentPage(currentPage+1)
  }

  render(){
    const {movieListLength, movieListPerPage} = this.props

    let pageNumbers=[];
    const lastPageNum = Math.ceil(movieListLength/movieListPerPage)
    for(var i=1; i<=lastPageNum; i++){
        pageNumbers.push(i)
    }

    const movieList=pageNumbers.map(
        (data)=>(<span className='page' key={data}
        onClick={()=>this.setCurrentPage(data)}>{data}</span>)
      )

    return (
      <div id="pagination">
        <div>
            총 글 갯수: {movieListLength}
        </div>
        <div>
            페이지당 글 갯수: {movieListPerPage}
        </div>
        <div>
            <span className='page' onClick={this.prevPage}>
                &lt;
            </span>
            <span>{movieList}</span>
            <span className='page' onClick={this.nextPage}>
                &gt;
            </span>
        </div>
      </div>
    );
  }
}

export default Pagination;

 

4. Movie.css

#movie{
    width: 900px;
    height: 350px;
    background-color: yellowgreen;
    margin: 10px;
}

#movie>#left-side{
    float: left;
    width: 250px;
    height: 330px;
    background-color: lightpink;
    padding-top: 60px;
    padding-left: 50px;
    box-sizing: border-box;
}

#movie>#right-side{
    float: left;
    width: 550px;
    height: 330px;
    background-color: lightblue;
}

#movie>#right-side>span{
    display: block;
    width: 540px;
    height: 35px;
    padding-top: 10px;
    box-sizing: border-box;
}

#movie>#right-side>span:first-child{
    background-color: lightgray;
}

#movie>#right-side>span:nth-child(2){
    background-color: lightgoldenrodyellow;
}

#movie>#right-side>span:nth-child(3){
    background-color: lightcyan;
}

#movie>#right-side>span:nth-child(4){
    background-color: sandybrown;
}

#movie>#right-side>span:nth-child(5){
    background-color: plum;
}

#movie>#right-side>span:nth-child(6){
    overflow: auto;
    height: 140px;
    background-color: lightsalmon;
}

 

5. MovieList.js

import { Component } from 'react';
import '../css/MovieList.css';
import Movie from './Movie';

class MovieList extends Component {
  constructor(props){
    super(props)
    this.state={
    
    }
  }

  render(){
    const result= this.props.movieList.map(
        (data) => (<Movie key={data.id} 
        medium_cover_image = {<img src= {data.medium_cover_image}/>}
        title={data.title} year={data.year} genres={data.genres}
        summary={data.summary} runtime={data.runtime} rating={data.rating}/>)
    )

    return (
      <div id="movie-list">
        {result}
      </div>
    );
  }
}

export default MovieList;

 

6. MovieList.css

#movie-list{
    width: 900px;
    height: auto;
    margin: 0 auto;
}

img{
    width: 150px;
    height: 200px;
}

 

7. Pagination.js

import { Component } from 'react';
import '../css/Pagination.css';

class Pagination extends Component {
  constructor(props){
    super(props)
    this.state={
    
    }
  }

  setCurrentPage=(page)=>{
    alert(page+"페이지 클릭(Pagination.js)")
    this.props.setCurrentPage(page)
  }

  prevPage=()=>{
    alert("이전")

    const {currentPage, setCurrentPage} = this.props
    if (currentPage==1){
        alert("여기는 첫 페이지 입니다.")
        return
    }
    setCurrentPage(currentPage-1)
  }

  nextPage=()=>{
    alert("다음")

    const {currentPage, setCurrentPage} = this.props
    const {lastPageNum} = this.state

    if (currentPage+1 > lastPageNum){
        alert("여기는 마지막 페이지 입니다.")
        return
    }
    setCurrentPage(currentPage+1)
  }

  render(){
    const {movieListLength, movieListPerPage} = this.props

    let pageNumbers=[];
    const lastPageNum = Math.ceil(movieListLength/movieListPerPage)
    for(var i=1; i<=lastPageNum; i++){
        pageNumbers.push(i)
    }

    const movieList=pageNumbers.map(
        (data)=>(<span className='page' key={data}
        onClick={()=>this.setCurrentPage(data)}>{data}</span>)
      )

    return (
      <div id="pagination">
        <div>
            총 글 갯수: {movieListLength}
        </div>
        <div>
            페이지당 글 갯수: {movieListPerPage}
        </div>
        <div>
            <span className='page' onClick={this.prevPage}>
                &lt;
            </span>
            <span>{movieList}</span>
            <span className='page' onClick={this.nextPage}>
                &gt;
            </span>
        </div>
      </div>
    );
  }
}

export default Pagination;

 

8. Pagination.css

#pagination{
    width: 900px;
    height: 100px;
    background-color: springgreen;
    position: relative;
    margin-left: 60px;
}

.page{
    display:inline-block;
    width:35px;
    height:35px;
    border:1px solid black;
    margin:5px;
    text-align: center;
    padding-top:5px;
    box-sizing: border-box;
    background-color: darkgray;
    cursor: pointer;
}

#pagination>div:nth-child(3){
    position: absolute;
    left: 240px;
}

 

9. 실행 결과

 

 

 

 

728x90

댓글