[React] Life Cycle Method

강은비·2022λ…„ 1μ›” 11일
0

React

λͺ©λ‘ 보기
8/36
post-custom-banner

react μŠ€ν„°λ””μ—μ„œ λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” κΈ°μˆ μ΄λΌλŠ” 책을 μ„ μ •ν–ˆκ³  이 책을 읽고 배운 것을 λ°”νƒ•μœΌλ‘œ μž‘μ„±λ˜μ—ˆλ‹€.


πŸ“Œ 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œλž€?

  • μ»΄ν¬λ„ŒνŠΈκ°€ λΈŒλΌμš°μ € 상에 λ‚˜νƒ€λ‚˜κ³ , μ—…λ°μ΄νŠΈ 되고, μ‚¬λΌμ§€κ²Œ 될 λ•Œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλ“€μ΄λ‹€. μΆ”κ°€μ μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ—λŸ¬κ°€ 났을 λ•Œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλ„ μžˆλ‹€.
  • 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • 총 μ„Έ 가지 μΉ΄ν…Œκ³ λ¦¬λ‘œ λ‚˜λ‰œλ‹€.
    • Mount, Update, Unmount

✨ Mount

DOM이 μƒμ„±λ˜κ³  μ»΄ν¬λ„ŒνŠΈκ°€ λΈŒλΌμš°μ € 상에 λ‚˜νƒ€λ‚˜λŠ” 것을 마운트라고 ν•œλ‹€.

  • constructor
  • getDerivedStateFromProps
  • render
  • componentDidMount

constructor

  • μ»΄ν¬λ„ŒνŠΈμ˜ μƒμ„±μž λ©”μ„œλ“œμ΄λ‹€.
  • μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ λ•Œλ§ˆλ‹€ κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • 이 λ©”μ„œλ“œμ—μ„œ 초기 stateλ₯Ό μ •ν•  수 μžˆλ‹€.

getDerivedStateFromProps

  • props값을 state에 λ„£μ–΄μ£Όκ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
  • λ‹€λ₯Έ 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œμ™€ 달리 static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•˜κ³ ,이 μ•ˆμ—μ„œλŠ” thisλ₯Ό μ‘°νšŒν•  수 μ—†λ‹€.
  • νŠΉμ • 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄ ν•΄λ‹Ή 객체 μ•ˆμ— μžˆλŠ” λ‚΄μš©λ“€μ΄ μ»΄ν¬λ„ŒνŠΈμ˜ state둜 μ„€μ •λ˜κ³ , 반면 null이 λ°˜ν™˜λ˜λ©΄ 아무 일도 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 이 λ©”μ„œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 초기 λ Œλ”λ§ 되기 전에도 호좜 되고, λ¦¬λ Œλ”λ§ 전에도 맀번 ν˜ΈμΆœλœλ‹€.
static getDerivedStateFromProps(nextProps, prevState){
    if (nextProps.value !== prevState.value){
        return { color: nextProps.color };
    }
    return null;
}

render

  • μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • 이 λ©”μ„œλ“œ μ•ˆμ—μ„œ this.props와 this.state에 μ ‘κ·Όν•  수 있으며, react elementλ₯Ό λ°˜ν™˜ν•œλ‹€.

    주의!

    • render λ©”μ„œλ“œ μ•ˆμ—μ„œλŠ” 이벀트 등둝이 μ•„λ‹Œ κ³³μ—μ„œ setStateλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆ 되고, λΈŒλΌμš°μ €μ˜ DOM에 μ ‘κ·Όν•΄μ„œλ„ μ•ˆ λœλ‹€.
    • DOM 정보λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ state에 λ³€ν™”λ₯Ό 쀄 λ•ŒλŠ” componentDidMountμ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

componentDidMount

  • 초기 λ Œλ”λ§μ΄ μ™„λ£Œλœ ν›„ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • 이 λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ—λŠ” μš°λ¦¬κ°€ λ§Œλ“  μ»΄ν¬λ„ŒνŠΈκ°€ 화면에 ν‘œμ‹œλœ μƒνƒœμ΄λ‹€.
  • ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μš”λ‘œ ν•˜λŠ” 데이터λ₯Ό μš”μ²­ν•˜κΈ° μœ„ν•΄ axios, fetch 등을 ν†΅ν•˜μ—¬ ajax μš”μ²­
  • DOM 의 속성을 μ½κ±°λ‚˜ 직접 λ³€κ²½
  • setTimeout, setInterval, λ„€νŠΈμ›Œν¬ μš”μ²­ 같은 비동기 μž‘μ—… 처리

✨ Update

  • propsκ°€ λ°”λ€” λ•Œ
  • stateκ°€ λ°”λ€” λ•Œ (setState())
  • this.forceUpdate()κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ

getDerivedStateFromProps

  • 이 λ©”μ„œλ“œλŠ” 초기 λ Œλ”λ§ 전에도 호좜되고, λ¦¬λ Œλ”λ§ 전에도 ν˜ΈμΆœλœλ‹€.
  • props 변화에 따라 state 값에도 λ³€ν™”λ₯Ό μ£Όκ³  싢을 λ•Œ μ‚¬μš©

shouldComponentUpdate

  • props λ˜λŠ” stateλ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ, μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¦¬λ Œλ”λ§ 할지 말지 κ²°μ •ν•˜λŠ” λ©”μ„œλ“œ
  • 이 λ©”μ„œλ“œλŠ” true ν˜Ήμ€ falseλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•˜λ©°,trueλ₯Ό λ°˜ν™˜ν•˜λ©΄ λ‹€μŒ 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œκ°€ 계속 μ‹€ν–‰λ˜κ³ , falseλ₯Ό λ°˜ν™˜ν•˜λ©΄ μž‘μ—…μ„ μ€‘μ§€ν•œλ‹€.
  • λ§Œμ•½ this.forceUpdate() ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄ μ—…λ°μ΄νŠΈκ°€ μ§„ν–‰λ˜λŠ” μƒνƒœλΌλ©΄ μœ„ λ©”μ„œλ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³ , λ°”λ‘œ render ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
shouldComponentUpdate(nextProps, nextState){
    console.log("shouldComponentUpdate", nextProps, nextState);
    // 숫자의 λ§ˆμ§€λ§‰ μžλ¦¬κ°€ 4λ©΄ λ¦¬λ Œλ”λ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
    return nextState.number % 10 !== 4;
}

render

getSnapshotBeforeUpdate

  • renderλ©”μ„œλ“œμ— μ˜ν•΄ λ§Œλ“€μ–΄μ§„ 결과물이 λΈŒλΌμš°μ € 화면에 λ‚˜νƒ€λ‚˜κΈ° 직전에 ν˜ΈμΆœλœλ‹€.
  • μ—…λ°μ΄νŠΈκ°€ μΌμ–΄λ‚˜κΈ° μ§μ „μ˜ DOM μƒνƒœλ₯Ό κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— 주둜 μ—…λ°μ΄νŠΈν•˜κΈ° μ§μ „μ˜ 값을 μ°Έκ³ ν•  일이 μžˆμ„ λ•Œ μ‚¬μš©λœλ‹€. (예: μŠ€ν¬λ‘€λ°” μœ„μΉ˜ μœ μ§€)
  • 이 λ©”μ„œλ“œμ—μ„œ λ°˜ν™˜λ˜λŠ” 값은 componentDidUpdate의 μ„Έ 번째 νŒŒλΌλ―Έν„°(snapshot)둜 전달할 수 μžˆλ‹€.
getSnapshotBeforeUpdate(prevState, prevState){
	if (prevState.array !== this.state.array){
        const { scrollTop, scrollHeight } = this.list;
        return { scrollTop, scrollHeight };
    }
}

componentDidUpdate

  • λ¦¬λ Œλ”λ§μ΄ μ™„λ£Œλœ ν›„ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
  • 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;
    }
}

✨ Unmount

μ»΄ν¬λ„ŒνŠΈλ₯Ό DOMμ—μ„œ μ œκ±°ν•˜λŠ” 것을 μ–Έλ§ˆμš΄νŠΈλΌ ν•œλ‹€.

componentWillUnmount

  • μ»΄ν¬λ„ŒνŠΈκ°€ DOMμ—μ„œ 제거되기 직전에 ν˜ΈμΆœλœλ‹€.
  • 주둜 DOM에 직접 λ“±λ‘λ˜μ—ˆλ˜ 이벀트λ₯Ό μ œκ±°ν•˜κ³ , λ§Œμ•½μ— setTimeout, setIntervalλ©”μ„œλ“œλ‘œ 타이머λ₯Ό λ“±λ‘ν–ˆλ‹€λ©΄ clearTimeout, clearInterval을 톡해 μ œκ±°ν•΄μ•Ό ν•œλ‹€.
  • λ§Œμ•½ μ™ΈλΆ€ 라이브러리λ₯Ό μ‚¬μš©ν–ˆκ³ , ν•΄λ‹Ή λΌμ΄λΈŒλŸ¬λ¦¬μ— dispose κΈ°λŠ₯이 μžˆλ‹€λ©΄ 이 λ©”μ„œλ“œ μ•ˆμ—μ„œ ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

componentDidCatch

  • 이 λ©”μ„œλ“œλŠ” 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

post-custom-banner

0개의 λŒ“κΈ€