일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CSS
- java
- web
- MAC
- Django
- 알고리즘 풀이
- HTML
- js
- 백준
- API
- AWS
- 파이썬
- 알고리즘 연습
- es6
- c++
- 알고리즘 문제
- 알고리즘
- django widget
- javascript
- Git
- django ORM
- form
- django rest framework
- Algorithm
- react
- PYTHON
- 파이썬 알고리즘
- 장고
- Baekjoon
- DRF
- Today
- Total
수학과의 좌충우돌 프로그래밍
[React] Axios 와 CSS 본문
일반적으로 javascript 로 API 데이터를 가져오기 위해서 fetch
와 axios
중 하나를 사용합니다.
둘 다 장단점이 존재하여 우월을 가리기 힘들지만 이번 포스팅에서는 axios
를 사용하여 네트워크 통신을 하도록 하겠습니다.
API 로는 YTS 에서 만든 영화 API 를 사용하도록 하겠습니다.
https://yts.lt/api/v2/list_movies.json
Axios
axios
를 사용하기 위해서는 설치와 import 가 필요합니다.
> npm install axios
// src/App.js
import axios from "axios";
// 생략
react 에서 API 데이터를 가져오는 부분은 componentDidMount()
메소드에서 구현을 합니다.
state
에 movies 배열을 하나 만든 후 getMovies()
메소드로 axios
로 데이터를 가져오겠습니다.
하지만 데이터를 가져오는데 시간이 필요하기 때문에 async
, await
를 이용해주었습니다.
import React from 'react';
import axios from 'axios';
class App extends React.Component {
state = {
movies: []
};
getMovies = async () => {
const movies = await axios.get("https://yts.lt/api/v2/list_movies.json");
}
componentDidMount() {
this.getMovies();
}
render() {
return <div></div>
}
}
export default App;
movies
에서 원하는 영화 목록에 접근하기 위해서는 아래 과정을 거쳐 접근할 수 있습니다.
20개의 영화 목록에 접근할 수 있죠.
getMovies = async () => {
const movies = await axios.get("https://yts.lt/api/v2/list_movies.json");
console.log(movies.data.data.movies);
}
// (20) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
하지만 이러한 방법보다는 ES6 의 Destructuring
을 사용하여 더 쉽게 나타낼 수 있습니다.
getMovies = async () => {
const {
data: {
data: { movies }
}
} = await axios.get("https://yts.lt/api/v2/list_movies.json");
console.log(movies);
}
// (20) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
이제 받아온 데이터를 state
에 넣어주도록 하겠습니다.
class App extends React.Component {
state = {
movies: []
};
getMovies = async () => {
const {
data: {
data: { movies }
}
} = await axios.get("https://yts.lt/api/v2/list_movies.json");
this.setState({ movies: movies });
}
// 생략
}
이 역시 Destructuring
을 사용하면 더 간단히 나타낼 수 있습니다.
this.setState({ movies });
이제 이를 화면에 render
해보도록 하겠습니다.
각각의 movie 데이터를 보여줄 Movie component
를 하나 더 정의하기 전에 우선 App.js 에서 사용하고 후에 정의하도록 하겠습니다.
state
의 데이터를 받아온 후에 각 movie object 를 Movie component
에 넘겨주었습니다.
render() {
const { movies } = this.state;
return <div>
{movies.map(movie => {
return <Movie
key={movie.id}
id={movie.id}
year={movie.year}
title={movie.title}
summary={movie.summary}
poster={movie.medium_cover_image}
/>
})}
</div>
}
현재까지 App.js
는 다음과 같습니다.
import React from 'react';
import axios from 'axios';
import Movie from './Movie';
class App extends React.Component {
state = {
movies: []
};
getMovies = async () => {
const {
data: {
data: { movies }
}
} = await axios.get("https://yts.lt/api/v2/list_movies.json?sort_by=rating");
this.setState({ movies });
}
componentDidMount() {
this.getMovies();
}
render() {
const { movies } = this.state;
return <div>
{movies.map(movie => {
return <Movie
key={movie.id}
year={movie.year}
title={movie.title}
summary={movie.summary}
poster={movie.medium_cover_image}
/>
})}
</div>
}
}
export default App;
이제 Movie.js
를 만들어보겠습니다.
Parent component
인 App 에서 props
를 받아오고 일단은 title
만 화면에 나타냈습니다.
propTypes
를 이용해 넘어오는 값들의 타입을 확인해주었습니다.
import React from "react";
import PropTypes from "prop-types";
function Movie({ year, title, summary, poster }) {
return <h3>{title}</h3>;
}
Movie.propTypes = {
year: PropTypes.number.isRequired,
title: PropTypes.string.isRequired,
summary: PropTypes.string.isRequired,
poster: PropTypes.string.isRequired
};
export default Movie;
CSS
현재까지 브라우저에 보여지는 화면은 html 태그들을 이용해 크기만 조절하였지 어떠한 css 도 적용되어 있지 않습니다.
react 에서 css 를 적용하는 방법에 대해서 알아보도록 하겠습니다.
우선 App.js
와 Movie.js
를 좀 더 구조화합시다.
구조화하는 방법은 html 과 똑같지만 한 가지 차이점이 존재합니다.
기존에 태그에 대한 이름을 정의하기 위해서 class
를 사용하였지만 이는 js 의 class 와 중복됩니다.
따라서 태그의 이름을 명시하는 경우, class
대신className
으로 사용합니다.
// src/App.js
return (
<section className="container">
<div className="movies">
{
movies.map(movie => {
return <Movie
key={movie.id}
year={movie.year}
title={movie.title}
summary={movie.summary}
poster={movie.medium_cover_image}
/>
})
}
</div>
</section>
)
// src/Movie.js
return (
<div className="movie">
<img src={poster} alt={title} title={title} />
<div className="movie__data">
<h3 className="moivie__title">{title}</h3>
<h5 className="moivie__year">{year}</h5>
<p className="moivie__summary">{summary}</p>
</div>
</div >
);
각각에 대한 css 파일을 만들고 js 파일에서 import 해주도록 합시다.
// src/App.js
import "./App.js"
// src/Movie.js
import "./Movie.js"
App.js
와 Movie.js
의 세부적인 코드는 css 에 대한 내용이므로 생략하도록 하겠습니다.
'웹프로그래밍 > React' 카테고리의 다른 글
[react] react-create-app의 Proxy (0) | 2020.02.27 |
---|---|
[React] axios 의 withCredentials (0) | 2020.02.17 |
[React] Component Life Cycle method (0) | 2020.01.26 |
[React] Class Component 와 State (1) | 2020.01.26 |
[React] Props 와 proptypes (2) | 2020.01.25 |