goal
- component 생명주기의 모든 것
constructor
해당 컴포넌트가 " 마운트되기 전"에 호출된다.
render
"데이터가 변경되어 새 화면을 그려야 할 때 자동으로 호출"된다.
render() 함수가 반환하는 JSX를 화면에 그린다.
componentDidMount()
"render() 함수가 JSX를 화면에 그린 이후"에 호출되는 함수이다. (= 컴포넌트 출력물이 DOM에 렌더링 된 이후)
컴포넌트가 화면에 모두 표현된 이후 해야 하는 작업들을 여기서 진행하게 된다.
componentDidUpdate()
"컴포넌트가 실제 화면에 출력된 이후" 호출되는 함수이다.
이 함수는 부모 컴포넌트로부터 전달된 이전 props 와, 이전 state을 인자로 전달받는다.
DOM의 정보를 변경할 때 사용한다.
componentWillUnmount()
"컴포넌트가 소멸되기 직전"에 호출되는 함수이다.
=> when an instance of a component is being created and inserted
: 컴포넌트의 인스턴스가 생성되고 DOM에 삽입 될 때, 순차적으로 호출된다.
=> when a component is being re-rendered
: (props or state가 변경되면 갱신이 발생한다.) 컴포넌트가 다시 렌더링 될 때 순차적으로 호출된다.
=> when a component is being removed
: 컴포넌트가 DOM에서 제거될 때 호출된다.
=> when there is an error during rendering
: 자식 컴포넌트를 렌더링하거나, 자식 컴포넌트가 생명주기 메서드를 호출하거나, 또는 자식 컴포넌트가 생성자 메서드를 호출하는 과정에서 오류가 발생했을 때에 호출된다.
this.props
or this.state
의 값을 활용해서 아래 중 하나를 반환해야 한다.constructor(props) {
super(props);
// Don't call this.setState() here!
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}
this.props
가 constructor내에서 정의되지 않아 버그 발생 가능)this.state
에 초기 state값을 할당한다.this.state
를 "직접" 할당할 수 있는 유일한 곳이다. /this.setState()
를 사용해야 한다.)componentDidMount()
를 사용한다.constructor(props) {
super(props);
// Don't do this!
this.state = { color: props.color };
}
class Clock extends React.Component {
constructor(props) {
super(props);
//! this.state = {}
// 현재 시간을 표시해야 하기 때문에 현재 시간이 포함된 객체로 this.state를 초기화하는 작업을 여기서 한다.
// 아래에서 이 state를 업데이트 하게 된다.
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
// # 여기에서의 코드로
}
componentWillUnmount() {
clearInterval(this.timerID);
}
// # 여기서
// 해당 컴포넌트는 setState()에 현재 시각을 포함하는 객체를 호출하면서 UI 업데이트를 진행한다.
// setState()를 호출하며, 리액트는 state가 변경된 것을 인지한다.
// 그리고 화면에 표시될 내용을 알아내기 위해 다시 render() 메서드를 호출한다.
// ## 다시 render() 로 가면
tick() {
this.setState({
date: new Date()
});
}
//! render()
// 리액트는 해당 컴포넌트의 render() 메소드를 호출한다.
// 이를 통해서 리액트는 화면에 표시되어야 할 내용을 알게 된다.
// 이후 리액트는 해당 컴포넌트의 렌더링 출력값을 일치시키기 위해 DOM을 업데이트 한다.
// 해당 컴포넌트의 출력값이 DOM에 삽입되면, 리액트는 componentDidMount() 메서드를 호출한다.
// ## 다시 여기서
// 이 과정에서 render() 메서드 안의 this.state.date가 변경되면서, 렌더링되는 값은 업데이트된 시각을 포함하게 된다.
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);