ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ReactJS (5)
    웹개발/JavaScript 2021. 1. 4. 21:38

    * Fetching Movies from API

    · axios

    : axios는 마치 fetch 위에 있는 작은 layer

    터미널에 npm install axios 하여 설치

     

    //async

    //javascript에게 componentDidMount 함수가 끝날 때까지 약간 시간이 걸릴 수 있다고 말해주고 그걸 기다려줘야 함

      async componentDidMount(){

        const movies = axios.get("https://yts-proxy.now.sh/list_movies.json");

    }

     

    * Rendering the Movies

      getMovies = async () => {

        const movies = await axios.get("https://yts-proxy.now.sh/list_movies.json");

        console.log(movies.data.data.movies);

      }

     

    //es6는 ECMA script의 새로운 버전

      getMovies = async () => {

        const { data: { data : {movies} } } = await axios.get("https://yts-proxy.now.sh/list_movies.json");

        console.log(movies);

      };

     

    - index.js

    import React from 'react';

    import ReactDOM from 'react-dom';

    import App from './App';

     

    ReactDOM.render(

        <App />document.getElementById('root')

    );

     

    - App.js

    import React from "react";

    import axios from "axios";

    import Movie from "./Movie";

     

    class App extends React.Component {

      state = {

        isLoading: true,

        movies: []

      };

      getMovies = async () => {

        const {

          data: {

            data: { movies }

          }

        } = await axios.get(

          "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"

        );

        this.setState({ moviesisLoading: false });

      };

      componentDidMount() {

        this.getMovies();

      }

      render() {

        const { isLoadingmovies } = this.state;

        return (

          <div>

            {isLoading

              ? "Loading..."

              : movies.map(movie => (

                  <Movie

                    key={movie.id}

                    id={movie.id}

                    year={movie.year}

                    title={movie.title}

                    summary={movie.summary}

                    poster={movie.medium_cover_image}

                  />

                ))}

          </div>

        );

      }

    }

     

    export default App;

     

    - Movie.js

    import React from "react";

    import PropTypes from "prop-types";

     

    function Movie({ idyeartitlesummaryposter }) {

      return <h4>{title}</h4>;

    }

     

    Movie.propTypes = {

      id: PropTypes.number.isRequired,

      year: PropTypes.number.isRequired,

      title: PropTypes.string.isRequired,

      summary: PropTypes.string.isRequired,

      poster: PropTypes.string.isRequired

    };

     

    export default Movie;

     

    * Styling the Movies

    App.css 와 Movie.css 파일을 만들어서 App.js와 Movie.js에 각각

    import "./App.css", import "./Movie.css"

     

    - Index.js

    import React from 'react';

    import ReactDOM from 'react-dom';

    import App from './App';

     

    ReactDOM.render(

        <App />document.getElementById('root')

    );

     

    - App.js

    import React from "react";

    import axios from "axios";

    import Movie from "./Movie";

    import "./App.css";

     

    class App extends React.Component {

      state = {

        isLoading: true,

        movies: []

      };

      getMovies = async () => {

        const {

          data: {

            data: { movies }

          }

        } = await axios.get(

          "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"

        );

        this.setState({ moviesisLoading: false });

      };

      componentDidMount() {

        this.getMovies();

      }

      render() {

        const { isLoadingmovies } = this.state;

        return (

          <section class="container">

            {isLoading ? (

              <div class="loader">

                <span class="loader__text">Loading...</span>

              </div>

            ) : (

              <div class="movies">

                {movies.map(movie => (

                  <Movie

                    key={movie.id}

                    id={movie.id}

                    year={movie.year}

                    title={movie.title}

                    summary={movie.summary}

                    poster={movie.medium_cover_image}

                  />

                ))}

              </div>

            )}

          </section>

        );

      }

    }

     

    export default App;

     

    - Movie.js

    import React from "react";

    import PropTypes from "prop-types";

    import "./Movie.css";

     

    function Movie({ yeartitlesummaryposter }) {

      return <div class="movie">

          <img src={poster} alt={title} title={title}></img>

          <div class="movie__data">

             <h3 class="mpovie__title">{title}</h3>

              <h5 class="movie__year">{year}</h5>

              <p class="movie__summary">{summary}</p>

          </div>

      </div>;

    }

     

    Movie.propTypes = {

      id: PropTypes.number.isRequired,

      year: PropTypes.number.isRequired,

      title: PropTypes.string.isRequired,

      summary: PropTypes.string.isRequired,

      poster: PropTypes.string.isRequired

    };

     

    export default Movie;

     

    * Adding Generes

    - index.js

    import React from 'react';

    import ReactDOM from 'react-dom';

    import App from './App';

     

    ReactDOM.render(

        <App />document.getElementById('root')

    );

     

    - App.js

    import React from "react";

    import axios from "axios";

    import Movie from "./Movie";

    import "./App.css";

     

    class App extends React.Component {

      state = {

        isLoading: true,

        movies: []

      };

      getMovies = async () => {

        const {

          data: {

            data: { movies }

          }

        } = await axios.get(

          "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"

        );

        this.setState({ moviesisLoading: false });

      };

      componentDidMount() {

        this.getMovies();

      }

      render() {

        const { isLoadingmovies } = this.state;

        return (

          <section className="container">

            {isLoading ? (

              <div className="loader">

                <span className="loader__text">Loading...</span>

              </div>

            ) : (

              <div className="movies">

                {movies.map(movie => (

                  <Movie

                    key={movie.id}

                    id={movie.id}

                    year={movie.year}

                    title={movie.title}

                    summary={movie.summary}

                    poster={movie.medium_cover_image}

                    genres={movie.genres}

                  />

                ))}

              </div>

            )}

          </section>

        );

      }

    }

     

    export default App;

     

    - Movie.js

    import React from "react";

    import PropTypes from "prop-types";

    import "./Movie.css";

     

    function Movie({ yeartitlesummaryposter , genres }) {

      return <div className="movie">

          <img src={poster} alt={title} title={title}></img>

          <div className="movie__data">

             <h3 className="mpovie__title">{title}</h3>

              <h5 className="movie__year">{year}</h5>

              <ul className="movie__genres"> 

                {genres.map((genreindex=> (

                    <li key={index} className="genres__genre">{genre}</li>

              ))} 

              </ul>

              <p className="movie__summary">{summary}</p>

          </div>

      </div>;

    }

     

    Movie.propTypes = {

      id: PropTypes.number.isRequired,

      year: PropTypes.number.isRequired,

      title: PropTypes.string.isRequired,

      summary: PropTypes.string.isRequired,

      poster: PropTypes.string.isRequired,

      genres: PropTypes.arrayOf(PropTypes.string).isRequired

    };

     

    export default Movie;

     

    - App.css

    *{

        box-sizingborder-box;

    }

     

    body {

        margin0;

        padding0;

        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,

          Ubuntu, Cantarell, "Open Sans""Helvetica Neue"sans-serif;

        background-color#eff3f7;

        height100%;

      }

    html,

    body,

    #root,

    .container {

        height100%;

        displayflex;

        justify-contentcenter;

    }

     

    .loader{

        width100%;

        height100%;

        displayflex;

        justify-contentcenter;

        align-itemscenter;

    }

     

    .movies{

        displayflex;

        justify-contentspace-between;

        align-itemsflex-start;

        flex-wrapwrap;

        padding50px;

        padding-top70px;

        width80%;

    }

     

    .movies .movie{

        width45%;

        background-colorwhite;

        margin-bottom70px;

        displayflex;

        align-itemsflex-start;

        justify-contentspace-between;

        font-weight300;

        padding20px;

        border-radius5px;

        color#adaeb9;

        box-shadow0 13px 27px -5px rgba(50,50,93,0.25),

        0 8px 16px -8px rgba(0,0,0,0.3), 0 -6px 16px -6px rgba(0,0,0,0.025);

    }

     

    .movie img {

        positionrelative;

        top-50px;

        max-width180px;

        margin-right30px;

        box-shadow0 30px 60px -12px rgba(50,50,50,93,0.25),

        0 18px 36px -18px rgba(0,0,0,0.3), 0 -12px 36px -8px rgba(0,0,0,0.0025);

    }

     

    .movie .movie__title,

    .movie .movie__year{

        margin0;

        font-weight300;

    }

     

    .movie .movie__title{

        margin-bottom5px;

        font-size24px;

        color#2c2c2c;

    }

     

    .movie .movie__genres{

        list-stylenone;

        padding0;

        margin0;

        displayflex;

        margin5px 0px;

    }

     

    .movie__genres li,

    .movie .movie__year{

        margin-right10px;

        font-size14px;

    }

     

    * Deploying to Git hub Pages

    (1) terminal에 npm i gh-pages 입력

    gh-pages는 웹사이트를 github의 hithub page 도메인에 나타나게 해줌

     

    (2) package.JSON에 homepage 추가

    (3) deploy: build 폴더를 upload

    (4) predeploy: npm run build를 실행하면 우리에게 build 폴더를 제공,

    deploy를 먼저 실행하면 predeploy가 자동적으로 실행됨 (이름은 같아야함)

    {

      "name""movie_app",

      "version""0.1.0",

      "private"true,

      "dependencies": {

        "@testing-library/jest-dom""^5.11.8",

        "@testing-library/react""^11.2.2",

        "@testing-library/user-event""^12.6.0",

        "axios""^0.21.1",

        "gh-pages""^2.2.0",

        "prop-types""^15.7.2",

        "react""^17.0.1",

        "react-dom""^17.0.1",

        "react-scripts""4.0.1",

        "web-vitals""^0.2.4"

      },

      "scripts": {

        "start""react-scripts start",

        "build""react-scripts build",

        "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://501501.github.io/movie_app/"

    }

     

    (5) terminal에 npm run deploy 입력

    '웹개발 > JavaScript' 카테고리의 다른 글

    ReactJS: props, state  (0) 2021.01.06
    ReactJS로 영화 웹 서비스 만들기  (0) 2021.01.04
    ReactJS (4)  (0) 2021.01.04
    ReactJS (3)  (0) 2021.01.03
    ReactJS (2)  (0) 2020.12.31

    댓글

Designed by Tistory.