이번 시간에는 state를 조금 더 연습해 보겠습니다.

컴포넌트 외부에 있는 무비 리스트를 state 안으로 옮겨보겠습니다.

class App extends Component {
//Render : componentWillMount() -> render() -> componentDidMount()
//Update : componentWillReceiveProps() -> shouldComponentUpdate() -> componentwillUpdate() -> render() -> componentDidUpdate
state = {
greeting: 'Hello React왕초보',
movies : [
{
title : "Matrix",
},
{
title : "Full Metal Jacket",
},
{
title : "Oldboy",
},
{
title : "Star Wars",
}
]
}

위와 같이 수정하자 아래와 같이 movies가 정의되지 않았다는 에러가 발생하였습니다.

Failed to compile.

./src/App.js
  Line 45:  'movies' is not defined  no-undef

Search for the keywords to learn more about each error.

app.js 의 아래 render 부분을 아래와 같이 수정하여주니 에러가 발생하지 않습니다.

render() {
return (
<div className="App">
{this.state.movies.map((movie, index) => {
return (
<Movie title={movie.title} poster={movie.poster} key={index} />
);
})}
</div>
);
}
}


여기에 영화 리스트에서 영화를 한 개 더 추가하고 싶을 때는 어떻게 해야 할까요?

일단 아래와 같이 comoponetDidMount 부분을 추가해봅시다.


componentDidMount(){
setTimeout(function(){
console.log('hello react 왕초보')
}, 1000)
}


1초 후에 console에서 아래와 같이 출력되는 것을 확인하실 수 있습니다.




이렇게 00초 후에 페이지 로드 후 , 어떤 작업을 수행시킬 수 있습니다.

하지만 위에 작성한 것은 예전 자바스크립트 문법입니다. function을 다 작성하지 않아도 됩니다.

아래와 같이 최신 자바스크립트 문법으로 가능합니다.

componentDidMount(){
setTimeout(() => {
console.log('hello react 왕초보')
}, 1000)
}


이제 진짜 영화 리스트를 추가해 보겠습니다.

componentDidMount(){
setTimeout(() => {
this.setState({
movies: [
...this.state.movies,
{
title: "신과함께",
}
]
});
}, 1000)
}

영화 제목  "신과함께" 을 추가해주었습니다. 아래와 같이 잘 출력되었습니다.




위에 코딩한 내용을 자세히 살펴보겠습니다.

컴포넌트가 mount하면 페이지 로드 후 1초 후에 새로운영화가 보여지게 되는 것입니다.

영화리스트에 영화를 추가하는 것입니다. 그런데 아래와 같이 해당코드를 삭제하게 되면

1초 후에 모든 영화가 사라지고 방금 추가한 영화만 남게 됩니다. 


...this.state.movies, 이 부분은 "이전 영화 리스트를 그대로 두고, 

그리고 한 개 영화를 추가"하라는 뜻입니다. 

이와 같이 state를 활용해서 응용을 하면 다양한 효과를 볼 수 있습니다.

예를 들면, 페이지를 로딩할 때 스크롤을 아래로 내릴수록 

더 많은 영화가 로딩되는 효과(infinite scroll)도 구현할 수 있습니다.

끝까지 스크롤하면 영화를 추가로 로딩해주는 것입니다. 페이스북에서도 이런 방식을 사용하고 있습니다. 

인스타그램도 동일합니다.


그럼 이제 아까 작성한 스크립트를 약간 변경해보겠습니다.

this.state.movies 부분 위치를 변경해보겠습니다. 시간도 5초로 변경하였습니다.

어떻게 될까요?

componentDidMount(){
setTimeout(() => {
this.setState({
movies: [
{
title: "신과함께",
},
...this.state.movies
]
});
}, 5000)
}






위에 캡쳐한 그대로 "신과함께"가 제일 위로 변경된 것을 확인하실 수 있습니다. 

오늘은 여기까지 하도록 하겠습니다. 고맙습니다.






+ Recent posts