
react μ€ν°λμμ 리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ μ΄λΌλ μ± μ μ μ νκ³ μ΄ μ± μ μ½κ³ λ°°μ΄ κ²μ λ°νμΌλ‘ μμ±λμλ€.
Mount, 	Update, Unmount
DOMμ΄ μμ±λκ³ μ»΄ν¬λνΈκ° λΈλΌμ°μ  μμ λνλλ κ²μ λ§μ΄νΈλΌκ³ νλ€.
constructorgetDerivedStateFromPropsrendercomponentDidMountstateλ₯Ό μ ν  μ μλ€.propsκ°μ stateμ λ£μ΄μ£Όκ³  μΆμ λ μ¬μ©νλ€.static ν€μλλ₯Ό λΆμ¬μΌ νκ³ ,μ΄ μμμλ thisλ₯Ό μ‘°νν  μ μλ€.stateλ‘ μ€μ λκ³ , λ°λ©΄ nullμ΄ λ°νλλ©΄ μ무 μΌλ λ°μνμ§ μλλ€.static getDerivedStateFromProps(nextProps, prevState){
    if (nextProps.value !== prevState.value){
        return { color: nextProps.color };
    }
    return null;
}
this.propsμ this.stateμ μ κ·Όν  μ μμΌλ©°, react elementλ₯Ό λ°ννλ€.μ£Όμ!
renderλ©μλ μμμλ μ΄λ²€νΈ λ±λ‘μ΄ μλ κ³³μμsetStateλ₯Ό μ¬μ©νλ©΄ μ λκ³ , λΈλΌμ°μ μDOMμ μ κ·Όν΄μλ μ λλ€.
DOMμ 보λ₯Ό κ°μ Έμ€κ±°λstateμ λ³νλ₯Ό μ€ λλcomponentDidMountμμ μ²λ¦¬ν΄μΌ νλ€.
axios, fetch λ±μ ν΅νμ¬ ajax μμ²DOM μ μμ±μ μ½κ±°λ μ§μ  λ³κ²½setTimeout, setInterval, λ€νΈμν¬ μμ² κ°μ λΉλκΈ° μμ
 μ²λ¦¬propsκ° λ°λ λstateκ° λ°λ λ (setState())this.forceUpdate()κ° νΈμΆλμμ λprops λ³νμ λ°λΌ state κ°μλ λ³νλ₯Ό μ£Όκ³  μΆμ λ μ¬μ©props λλ stateλ₯Ό λ³κ²½νμ λ, μ»΄ν¬λνΈλ₯Ό 리λ λλ§ ν μ§ λ§μ§ κ²°μ νλ λ©μλtrue νΉμ falseλ₯Ό λ°νν΄μΌ νλ©°,trueλ₯Ό λ°ννλ©΄ λ€μ μλͺ
μ£ΌκΈ° λ©μλκ° κ³μ μ€νλκ³ , falseλ₯Ό λ°ννλ©΄ μμ
μ μ€μ§νλ€.this.forceUpdate() ν¨μκ° νΈμΆλμ΄ μ
λ°μ΄νΈκ° μ§νλλ μνλΌλ©΄ μ λ©μλλ μ€νλμ§ μκ³ , λ°λ‘ render ν¨μλ₯Ό νΈμΆνλ€.shouldComponentUpdate(nextProps, nextState){
    console.log("shouldComponentUpdate", nextProps, nextState);
    // μ«μμ λ§μ§λ§ μλ¦¬κ° 4λ©΄ 리λ λλ§νμ§ μμ΅λλ€
    return nextState.number % 10 !== 4;
}renderλ©μλμ μν΄ λ§λ€μ΄μ§ κ²°κ³Όλ¬Όμ΄ λΈλΌμ°μ  νλ©΄μ λνλκΈ° μ§μ μ νΈμΆλλ€.DOM μνλ₯Ό κ°μ Έμ€κΈ° λλ¬Έμ μ£Όλ‘ μ
λ°μ΄νΈνκΈ° μ§μ μ κ°μ μ°Έκ³ ν  μΌμ΄ μμ λ μ¬μ©λλ€. (μ: μ€ν¬λ‘€λ° μμΉ μ μ§)componentDidUpdateμ μΈ λ²μ§Έ νλΌλ―Έν°(snapshot)λ‘ μ λ¬ν  μ μλ€.getSnapshotBeforeUpdate(prevState, prevState){
	if (prevState.array !== this.state.array){
        const { scrollTop, scrollHeight } = this.list;
        return { scrollTop, scrollHeight };
    }
}prevProps, prevState νλΌλ―Έν°λ₯Ό ν΅ν΄ μ
λ°μ΄νΈ μ μ μ»΄ν¬λνΈμ propsμ state κ°μ μ κ·Όν  μ μλ€.getSnapshotBeforeUpdate λ©μλμμ λ°νλ κ°μ΄ μλ€λ©΄ μ¬κΈ°μ snapshot κ°μ μ λ¬λ°μ μ μλ€.// μ€ν¬λ‘€λ° μ μ§
componentDidUpdate(prevProps, prevState, snapshot){
    if (snapshot){
        const { scrollTop } = this.list;
        if (scrollTop === snapshot.scrollTop) return;
        const diff = this.scrollHeight - snapshot.scrollHeight;
        this.list.scrollTop += diff;
    }
}
μ»΄ν¬λνΈλ₯Ό DOMμμ μ κ±°νλ κ²μ μΈλ§μ΄νΈλΌ νλ€.
DOMμμ μ κ±°λκΈ° μ§μ μ νΈμΆλλ€.DOMμ μ§μ  λ±λ‘λμλ μ΄λ²€νΈλ₯Ό μ κ±°νκ³ , λ§μ½μ setTimeout, setIntervalλ©μλλ‘ νμ΄λ¨Έλ₯Ό λ±λ‘νλ€λ©΄ clearTimeout, clearIntervalμ ν΅ν΄ μ κ±°ν΄μΌ νλ€.dispose κΈ°λ₯μ΄ μλ€λ©΄ μ΄ λ©μλ μμμ νΈμΆνλ©΄ λλ€.v16μμ μλ‘κ² λμ
λμμΌλ©°, μ»΄ν¬λνΈ λ λλ§ λμ€μ μλ¬κ° λ°μνμ λ νΈμΆλλ€.class ErrorBoundary extends Component {
    state = {
        error: false
    };
    
    constructor (props){
       super(props);
    }
    
    componentDidCatch(error,info){
    	this.setState({
       	    error: true;
    	});
    }
    
    render() {
        if (this.state.error){
            return <h1>Error!</h1>
        }
        return this.props.children;
    }
    
}
export default ErrorBoundary;

μ°Έκ³ : React lifecycle methods diagram