Class Component
- function 컴포넌트는 뭔가를 리턴하고 스크린에 표시되지만 class 컴포넌트는 react 컴포넌트로부터 확장되고 스크린에 표시된다.
- react는 자동적으로 class 컴포넌트의 렌더 메서드를 실행된다.
- 클래스 컴포넌트를 쓰는 이유는 state를 쓰기 위해서다.
State
- state는 객체이며 컴포넌트의 데이터를 state에 넣을 수 있다.
- state의 데이터는 바꿀 수 있으며, 바꿀때는 setState()를 이용해야 한다.
- class 컴포넌트에서 state를 쓸때는 컴포넌트의 형태가 클래스이기 때문에 this.state로 사용할 수 있다.
import React from 'react';
import PropTypes from 'prop-types';
class App extends React.Component {
state = {
count: 0,
};
render() {
return <h1>state is ? {this.state.count}</h1>;
}
}
export default App;
- button에는 기본적으로 onClick이라는 prop이 있다.
- 아래 코드와 같이 setState에서 바로 this.state를 하는 것은 성능이슈가 발생할 수 있다.
import React from 'react';
import PropTypes from 'prop-types';
class App extends React.Component {
state = {
count: 0,
};
add = () => {
this.setState({
count: this.state.count + 1
})
};
minus = () => {
this.setState({
count: this.state.count -1
})
};
render() {
export default App;
- 대신에 아래와 같이 current를 이용하여 하는 방법이 외부상태에 의존하지 않는 가장 좋은 방법이다. (current는 현재의 state의 값을 얻을 수 있다.)
import React from 'react';
import PropTypes from 'prop-types';
class App extends React.Component {
state = {
count: 0,
};
add = () => {
this.setState(current => ({
count: current.count + 1
}))
};
minus = () => {
this.setState(current => ({
count: current.count - 1
}))
};
render() {
export default App;
- setState를 호출할때 마다 리액트는 새로운 state와 함께 render function을 호출한다.!!!(중요)
- constructor는 리액트에서 오는게 아니며, 자바스크립트에서 class를 만들 때 호출된다.
Life Cycle Method
- 리액트 클래스 컴포넌트는 life cycle method를 가지고 있다.
- 가장 자주 쓰이는 Life Cycle Method
componentDidMount()
componentDidUpdate()
componentWillUnmount()
- 이를 활용한 예제로 render 함수 내에 삼항연산자와 componentDidMount를 이용하여 API로 부터 데이터를 받으면 state를 변화시켜 렌더를 다시 시키는 것을 할 수 있다.
import React from 'react';
class App extends React.Component {
state = {
isLoading: true,
};
componentDidMount() {
setTimeout(() => {
this.setState({
isLoading: false,
});
}, 2000);
}
render() {
const { isLoading } = this.state;
return <div>{isLoading ? 'Loading !!' : 'We are READY!!!!!!'}</div>;
}
}
export default App;