티스토리 뷰
React 컴포넌트 안의 state와 생명주기 개념을 알아보고 캡슐화를 해보자.
아래의 예시는 ReactDOM.render()를 사용하여 렌더링 된 출력값을 변경하는 것을 알아보았다.
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>It is {new Date().toLocaleTimeString()}.</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);
위의 코드를 캡슐화 해보자
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('root')
);
}
setInterval(tick, 1000);
위의 코드를 state를 추가해보자. state는 props와 유사하지만, 비공개이며 컴포넌트에 의해 완전히 제어된다.
우선 함수에서 클래스로 변환하자.
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.props.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('root')
);
}
setInterval(tick, 1000);
그리고 date를 props에서 state로 이동해 보자.
1. render() 메서드 안에 있는 this.props.date를 this.state.date로 변경합니다.
2. 초기 this.state를 지정하는 class constructor를 추가하자.
constructor 메소드는 class로 생성된 객체를 생성하고 초기화 하기 위한 특수한 메소드이다. constructor라는 이름을 가진 특수한 메소드는 클래스 안에 한 개만 존재할 수 있다. 만약 클래스에 여러 개의 constructor메소드가 존재하면 SyntaxError가 발생한다. constructor는 부모 클래스의 constructor를 호출하기 위해 super 키워드를 사용할 수 있다.
3. <Clock /> 요소에서 date prop을 삭제합니다.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
위의 내용을 실행 시켜보면 정적으로 시간초가 가지 않는다. 이제 Clock가 스스로 타이머를 설정하고 매초 스스로 업데이트 하도록 만들어 보자.
생명주기 메서드 추가
- 타이머설정 : Clock가 처음 DOM에 랜더링 될 시 = React에서 마운팅이라 한다.
- 타이머해제 : Clock에 의해 DOM이 삭제 될 시
컴포넌트 클래스에서 특별한 메서드를 선언하여 컴포넌트가 마운트되거나 언마운트 될 때 일부 코드를 작동할 수 있다.
import React from 'react';
import ReactDOM from 'react-dom';
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
1. <Clock />가 ReactDOM.render()로 전달되었을 때 React는 Clock 컴포넌트의 constructor를 호출합니다. Clock이 현재 시각을 표시해야 하기 때문에 현재 시각이 포함된 객체로 this.state를 초기화합니다. 나중에 이 state를 업데이트할 것입니다.
2. React는 Clock 컴포넌트의 render() 메서드를 호출합니다. 이를 통해 React는 화면에 표시되어야 할 내용을 알게 됩니다. 그 다음 React는 Clock의 렌더링 출력값을 일치시키기 위해 DOM을 업데이트합니다.
3. Clock 출력값이 DOM에 삽입되면, React는 componentDidMount() 생명주기 메서드를 호출합니다. 그 안에서 Clock 컴포넌트는 매초 컴포넌트의 tick() 메서드를 호출하기 위한 타이머를 설정하도록 브라우저에 요청합니다.
4. 매초 브라우저가 tick() 메서드를 호출합니다. 그 안에서 Clock 컴포넌트는 setState()에 현재 시각을 포함하는 객체를 호출하면서 UI 업데이트를 진행합니다. setState() 호출 덕분에 React는 state가 변경된 것을 인지하고 화면에 표시될 내용을 알아내기 위해 render() 메서드를 다시 호출합니다. 이 때 render() 메서드 안의 this.state.date가 달라지고 렌더링 출력값은 업데이트된 시각을 포함합니다. React는 이에 따라 DOM을 업데이트합니다.
5. Clock 컴포넌트가 DOM으로부터 한 번이라도 삭제된 적이 있다면 React는 타이머를 멈추기 위해 componentWillUnmount() 생명주기 메서드를 호출합니다.
state
동적인 데이터를 다룰 때 사용하는 것이 state이다.
'Web > React' 카테고리의 다른 글
[React] JSX 기초 개념 정리 (0) | 2021.09.01 |
---|---|
[React] 시작하기 (javaScript) (0) | 2021.08.30 |
[React]이벤트 처리하기 (0) | 2020.07.20 |
[React]Components와 props (0) | 2020.07.15 |
[React]요소(element) 렌더하기 (0) | 2020.07.15 |
- Total
- Today
- Yesterday
- react
- react autoFocus
- vuejs
- Python
- Queue
- next.config.js
- TensorFlow
- 클라우데라
- DFS
- mongoDB
- error:0308010C:digital envelope routines::unsupported
- NextJS
- 자연어처리
- Deque
- nodejs
- logout
- typescript
- useHistory 안됨
- read_csv
- useState
- django
- BFS
- 자료구조
- JavaScript
- UserCreationForm
- Express
- pandas
- nextjs autoFocus
- login
- Vue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |