리액트 컴포넌트들에는 라이프사이클이라는 것이 존재한다.
생성(mounting) -> 업데이트(updating) -> 제거(unmounting)
생명주기 메서드는 컴포넌트가 브라우저 상에 나타나고, 업데이트되고, 사라지게 될때 호출되는 메서드
컴포넌트의 인스턴스가 생성되어, DOM에 삽입될 때 순서대로 호출
✏️ constructor()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
render() {
return <h1>My Favorite Color is {this.state.favoritecolor}</h1>
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
✏️ getDerivedStateFromProps()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
static getDerivedStateFromProps(props, state) {
return { favoritecolor: props.favcol }
}
render() {
return <h1>My Favorite Color is {this.state.favoritecolor}</h1>
}
}
ReactDOM.render(<Header favcol="yellow" />, document.getElementById('root'))
✏️ render()
예시
class Header extends React.Component {
render() {
return <h1>This is the content of the Header component</h1>
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
✏️ componentDidMount()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
componentDidMount() {
setTimeout(() => {
this.setState({ favoritecolor: 'yellow' })
}, 1000)
}
render() {
return <h1>My Favorite Color is {this.state.favoritecolor}</h1>
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
props나 state가 변경되면 렌더가 진행되며 순서대로 호출된다.
✏️ getDerivedStateFromProps()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
static getDerivedStateFromProps(props, state) {
return { favoritecolor: props.favcol }
}
changeColor = () => {
this.setState({ favoritecolor: 'blue' })
}
render() {
return (
<div>
<h1>My Favorite Color is {this.state.favoritecolor}</h1>
<button type="button" onClick={this.changeColor}>
Change color
</button>
</div>
)
}
}
ReactDOM.render(<Header favcol="yellow" />, document.getElementById('root'))
✏️ shouldComponentUpdate()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
shouldComponentUpdate() {
return false
}
changeColor = () => {
this.setState({ favoritecolor: 'blue' })
}
render() {
return (
<div>
<h1>My Favorite Color is {this.state.favoritecolor}</h1>
<button type="button" onClick={this.changeColor}>
Change color
</button>
</div>
)
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
✏️ render()
✏️ getSnapshotBeforeUpdate()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
componentDidMount() {
setTimeout(() => {
this.setState({ favoritecolor: 'yellow' })
}, 1000)
}
getSnapshotBeforeUpdate(prevProps, prevState) {
document.getElementById('div1').innerHTML =
'Before the update, the favorite was ' + prevState.favoritecolor
}
componentDidUpdate() {
document.getElementById('div2').innerHTML =
'The updated favorite is ' + this.state.favoritecolor
}
render() {
return (
<div>
<h1>My Favorite Color is {this.state.favoritecolor}</h1>
<div id="div1"></div>
<div id="div2"></div>
</div>
)
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
✏️ componentDidUpdate()
예시
class Header extends React.Component {
constructor(props) {
super(props)
this.state = { favoritecolor: 'red' }
}
componentDidMount() {
setTimeout(() => {
this.setState({ favoritecolor: 'yellow' })
}, 1000)
}
componentDidUpdate() {
document.getElementById('mydiv').innerHTML =
'The updated favorite is ' + this.state.favoritecolor
}
render() {
return (
<div>
<h1>My Favorite Color is {this.state.favoritecolor}</h1>
<div id="mydiv"></div>
</div>
)
}
}
ReactDOM.render(<Header />, document.getElementById('root'))
컴포넌트를 DOM에서 제거하는 과정
✏️ componentWillUnmount()
리액트의 컴포넌트는 생성 -> 업데이트 -> 제거의 생명 주기를 갖고 있다. 생성 단계에서는 constructor에 의해서 state가 초기화된 뒤, render 메소드가 실행되면서 DOM에 컴포넌트를 마운트하게 된다. 마운트가 완료되면 componentDidMount라는 생명주기 메소드가 실행이 된다. 업데이트 단계에서는 props가 새롭게 전달되거나, 상태가 업데이트 되는 경우 re-rendering을 진행하면서 DOM에 변화된 부분을 업데이트 한다. 업데이트가 완료되면 componentDidUpdate 생명주기 메소드가 실행된다. 마지막으로, 제거 단계에서는 DOM에 나타나있던 컴포넌트가 마운트 해제될 경우 제거되기 직전에 componentWillUnmount 생명주기 메소드가 실행되며, componentDidMount()에서 생성된 작업 등을 정리할 때 사용된다.
출처: https://intrepidgeeks.com/tutorial/response-the-life-cycle-of-the-response
너무나도 좋은 참조 자료