app.css에 몇가지 규칙을 추가하겠습니다.
.App {
padding:50px;
display: flex;
justify-content: space-around;
flex-wrap: wrap;
font-size:14px;
}
.App--loading{
display: flex;
justify-content: center;
align-content: center;
height: 100%;
}
아래는 전 시간까지 작성하였던 app.js 파일입니다.
import React, { Component } from 'react';
import './App.css';
import Movie from './Movie';
class App extends Component {
//Render : componentWillMount() -> render() -> componentDidMount()
//Update : componentWillReceiveProps() -> shouldComponentUpdate() -> componentwillUpdate() -> render() -> componentDidUpdate
state = {};
componentDidMount() {
this._getMoives();
}
_renderMovies = () => {
const movies = this.state.movies.map((movie ) => {
console.log(movie)
return <Movie
title={movie.title_english}
poster={movie.medium_cover_image}
key={movie.id}
genres={movie.genres}
synopsis={movie.synopsis} />;
});
return movies;
};
_getMoives = async () => {
const movies = await this._callApi()
this.setState({
movies
})
}
_callApi = () => {
.then(response => response.json())
.then(json => json.data.movies)
.catch(err => console.log(err));
};
render() {
return (
<div className="App">
{this.state.movies ? this._renderMovies() : "Loading"}
</div>
);
}
}
export default App;
아래와 같이 일부 수정을 해주었습니다.
여기서 수정한 것은 app 컴포넌트의 클래스 이름입니다.
render() {
const { movies } = this.state;
return (
<div className={movies ? "App" : "App-loading"}>
{movies ? this._renderMovies() : "Loading"}
</div>
);
}
}
state에 movies 가 있는지 물어봅니다.
movies가 있으면 div의 이름은 app , movies가 없으면 app-loading이라고 정했습니다.
movie.js 파일도 아래와 같이 수정 하였습니다.
import React from "react";
import PropTypes from "prop-types";
import LinesEllipsis from "react-lines-ellipsis";
import "./Movie.css";
function Movie({ title, poster, genres, synopsis }) {
return (
<div className="Movie">
<div className="Movie__Column">
<MoviePoster poster={poster} alt={title} />
</div>
<div className="Movie__Column">
<h1>{title}</h1>
<div className="Movie__Genres">
{genres.map((genre, index) => (
<MovieGenre genre={genre} key={index} />
))}
</div>
<div className="Movie__Synopsis">
<LinesEllipsis
text={synopsis}
maxLine="3"
ellipsis="..."
trimRight
basedOn="letters"
/>
</div>
</div>
</div>
);
}
function MoviePoster({ poster, alt }) {
return <img src={poster} alt={alt} title={alt} className="Movie__Poster" />;
}
function MovieGenre({ genre }) {
return <span className="Movie__Genre">{genre}</span>;
}
Movie.propTypes = {
title: PropTypes.string.isRequired,
poster: PropTypes.string.isRequired,
genres: PropTypes.array.isRequired,
synopsis: PropTypes.string.isRequired
};
MoviePoster.propTypes = {
poster: PropTypes.string.isRequired,
alt: PropTypes.string.isRequired
};
MovieGenre.propTypes = {
genre: PropTypes.string.isRequired
};
export default Movie;
그리고 index.css도 수정하였습니다.
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-color: #EFF3F7;
height: 100%;
}
html, #root{
height: 100%;
}
폰트, 배경색, 높이를 정해줬습니다.
movie.css 도 아래와 같이 수정해주었습니다.
배경색, 박스쉐도우, 마진, 플렉스, 그리고 movie column도 조정했습니다.
그리고 영화제목 css, 장르, 시놉시스, 포스터에 쉐도우도 넣었습니다.
.Movie{
background-color:white;
width:40%;
display: flex;
justify-content: space-between;
align-items:flex-start;
flex-wrap: wrap;
margin-bottom: 50px;
text-overflow: ellipsis;
padding:0 20px;
box-shadow: 0 8px 38px rgba(133,133,133,0.3),0 5px 12px rgba(133,133,133,0.22);
}
.Movie__Column{
width: 30%;
box-sizing: border-box;
text-overflow: ellipsis;
}
.Movie__Column:last-child{
padding: 20px 0;
width:60%;
}
.Movie h1{
font-size:20px;
font-weight: 600;
}
.Movie .Movie__Genres{
display: flex;
flex-wrap: wrap;
margin-bottom: 20px;
}
.Movie__Genres .Movie__Genre{
margin-right: 10px;
color: #B4B5BD;
}
.Movie .Movie__Synopsis{
text-overflow: ellipsis;
color: #B4B5BD;
overflow: hidden;
}
.Movie .Movie__Poster{
max-width: 100%;
position: relative;
top:-20px;
box-shadow: -10px 19px 38px rgba(83, 83, 83, 0.3), 10px 15px 12px rgba(80, 80, 80, 0.22);
}
아래와 같이 responsive 작업도 해주었습니다.
@media screen and (min-width:320px) and (max-width:667px){
.Movie{
width:100%;
}
}
@media screen and (min-width: 320px) and (max-width: 667px) and (orientation: portrait){
.Movie{
width:100%;
flex-direction: column;
}
.Movie__Poster{
top:0;
left:0;
width:100%;
}
.Movie__Column{
width:100%!important;
}
}
위에는 모바일 폰, 아래는 모바일-portrait 모드로 작업을 하였습니다.
이렇게 코딩을 모두 완료하였고 화면을 확인해보겠습니다.
화면을 줄이면 자동으로 보여지는 화면도 수정되는 것을 아래와 같이 확인할 수 있습니다.
이번시간까지 해서 총 20번의 연재를 마쳤습니다. 높은 품질의 결과물은 아니였어도 강의를 따라하면서
끝까지 결과물을 완성할 수 있다는 것에 의미를 두고 싶습니다.
부족하였지만 여러분들에게도 조금이나마 도움이 되는 글들이였기를 바랍니다.
고맙습니다.
'React > 왕초보 도전' 카테고리의 다른 글
19. 간단한 영화 웹 서비스 만들기 14 (0) | 2018.01.30 |
---|---|
18. 간단한 영화 웹 서비스 만들기 13 (0) | 2018.01.30 |
17. 간단한 영화 웹 서비스 만들기 12 (0) | 2018.01.25 |
16. 간단한 영화 웹 서비스 만들기 11 (0) | 2018.01.23 |
15. 간단한 영화 웹 서비스 만들기 10 (0) | 2018.01.19 |