import React, { Component } from 'react';
class LifeCycleSample extends Component{
state={
error:false,
number:0,
color:null,
}
myRef = null;
// ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ์ฒ์์ผ๋ก ์คํ๋๋ค.
// ์ด๊ธฐ state๋ฅผ ์ ํ๋ค.
constructor(props){
super(props);
console.log('constructor');
}
// props๋ก ๋ฐ์ ์จ ๊ฐ์ state์ ๋๊ธฐํ์ํค๋ ์ฉ๋
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋, ์
๋ฐ์ดํธ๋ ๋ ํธ์ถ
static getDerivedStateFromProps(nextProps,prevState){
console.log('getDerivedStateFromProps');
if(nextProps !== prevState){
return{
color:nextProps.color
};
}
// ๊ธฐ๋ณธ state๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋ null ๋ฐํ
return null;
}
// ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ฒซ ๋ ๋๋ง์ ๋ค ๋ง์น ํ ์คํ
// js๋ผ์ด๋ธ๋ฌ๋ฆฌ or ํ๋ ์์ํฌ์ ํจ์ ํธ์ถ or ์ด๋ฒคํธ ๋ฑ๋ก
// setTimeout, setInterval, ๋คํธ์ํฌ ์์ฒญ ๊ฐ์ ๋น๋๊ธฐ ์์
์ฒ๋ฆฌ
componentDidMount(){
console.log('componentDidMount');
}
// props or state ๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ฆฌ๋ ๋๋ง์ ์์ํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ๋ ๋ฉ์๋
// ๋ฐํ true/false
// ๋ฉ์๋ ์์ฑ ์์์ ๊ธฐ๋ณธ ๋ฐํ๊ฐ true
// false๋ฅผ ๋ฐํํ๋ฉด ์
๋ฐ์ดํธ ๊ณผ์ ์ ์ฌ๊ธฐ์ ์ค์ง
// this.props, this.state๋ก ์ ๊ทผํ๊ณ ์๋ก ์์ฑ๋ nextProp, nextState๋ก ์ ๊ทผ ๊ฐ๋ฅ
// ์
๋ฐ์ดํธ ์ฑ๋ฅ์ ๊ฐ์
shouldComponentUpdate(nextProps,nextState){
console.log('shouldComponentUpdate',nextProps,nextState);
return nextState.number % 10 !==4;
}
// DOM์์ ์ ๊ฑฐํ ๋ ์คํ ComponentDidMount์์ ๋ฑ๋กํ ์ด๋ฒคํธ, ํ์ด๋จธ, ์ง์ ์์ฑํ DOM์ด ์๋ค๋ฉด ์ฌ๊ธฐ์ ์ ๊ฑฐ ํด์ผ ํจ
componentWillUnmount(){
console.log('componentWillUnmount');
}
handleClick= () => {
this.setState({
number:this.state.number+1
});
}
// render์์ ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฌผ์ด ๋ธ๋ผ์ฐ์ ์ ์ค์ ๋ก ๋ฐ์๋๊ธฐ ์ง์ ํธ์ถ
// ์ด ๋ฉ์๋์ ๋ฐํ๊ฐ์ componentDidUpdate์์ ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ snapshot ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ๋๋ฐ
// ์ฃผ๋ก ์
๋ฐ์ดํธํ๊ธฐ ์ง์ ์ ๊ฐ์ ์ฐธ๊ณ ํ ์ผ์ด ์์ ๋ ํ์ฉ (์: ์คํฌ๋ฃฐ๋ฐ ์์น ์ ์ง)
getSnapshotBeforeUpdate(prevProps,prevState){
console.log('getSnapshotBeforeUpdate');
if(prevProps !== this.props.color){
return this.myRef.style.color;
}
return null;
}
// ๋ฆฌ๋ ๋๋ง ์๋ฃํ ํ ์คํ, ์
๋ฐ์ดํธ๊ฐ ๋๋ ์งํ -> DOM๊ด๋ จ ์ฒ๋ฆฌ ํด๋ ๋ฌด๋ฐฉ
// prevProps, prevState๋ฅผ ์ฌ์ฉํด ์ด์ ์ ๊ฐ์ก๋ ๋ฐ์ดํฐ์ ์ ๊ทผ
// getSnapshotBeforeUpdate์ ๋ฐํ๊ฐ์ด ์๋ค๋ฉด snapshot ๊ฐ ์ ๋ฌ๋ฐ์ ์ ์์
componentDidUpdate(prevProps,prevState,snapshot){
console.log('componentDidUpdate',prevProps,prevState);
if(snapshot){
console.log('์
๋ฐ์ดํธ๋๊ธฐ ์ง์ ์์:', snapshot);
}
}
// ์๋ฌ ์๊ฒผ์ ๋ ์คํ
// componentDidCatch(erro,info){
// this.setState({
// error:true
// });
// console.log({erro,info});
// }
// ์ปดํฌ๋ํธ ๋ชจ์์๋ฅผ ์ ์ํ๋ค.
// props,state์ ์ ๊ทผํ์ฌ ๋ฆฌ์กํธ ์์๋ฅผ ๋ฐํํ๋ค.
// ์๋ฌด๊ฒ๋ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ง ์์ ๋ null or false
// setState ์ฌ์ฉ ๊ธ์ง, ๋ธ๋ผ์ฐ์ DOM ์ ๊ทผ ๊ธ์ง -> componentDidMount์์ ์ฒ๋ฆฌํ๋ค.
render(){
console.log('render');
const style={
color:this.props.color
};
return(
<div>
{this.props.missing.value}
<h1 style={style} ref={ref => this.myRef=ref}>{this.state.number}</h1>
<p>color:{this.state.color}</p>
<button onClick={this.handleClick}>๋ํ๊ธฐ</button>
</div>
)
}
}
export default LifeCycleSample;
๋ฐ์ํ
'๐ WEB > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React - useReducer (0) | 2021.05.24 |
---|