πŸ₯ κ³΅μ‹λ¬Έμ„œλ‘œ λ°°μš°λŠ” React

Sohyeon BakΒ·2022λ…„ 8μ›” 23일
0

React

λͺ©λ‘ 보기
8/9
post-thumbnail

05. Lifecycle

λ¦¬μ•‘νŠΈμ—μ„œ μ»΄ν¬λ„ŒνŠΈκ°€ μ‹€ν–‰ 될 λ•Œ μ»΄ν¬λ„ŒνŠΈμ—λŠ” 생성, μ—…λ°μ΄νŠΈ, 제거 λ™μž‘μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€κ²Œ λœλ‹€.
생λͺ…μ£ΌκΈ°(lifecycle) λ©”μ†Œλ“œλŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©λ˜λ©°, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” Hook을 μ‚¬μš©ν•œλ‹€.
생λͺ…μ£ΌκΈ° λ©”μ†Œλ“œμ™€ Hook은 λΉ„μŠ·ν•˜κ²Œ μ‚¬μš©λ˜μ§€λ§Œ μ»€λ²„ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯도 있고, μž‘λ™λ°©μ‹λ„ λ‹€λ₯΄λ‹€.

Reactμ—μ„œ λžœλ”λ§μ΄ μ‹€ν–‰λ˜λŠ” κ³Όμ •

  • Props
  • State
  • forceUpdate()
  • λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ λžœλ”λ§

μ»΄ν¬λ„ŒνŠΈκ°€ λ³€κ²½λ˜λŠ” μ—¬λŸ¬ μš”μΈλ“€κ³Ό μƒμ†ν•˜λŠ” μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ“± μ—¬λŸ¬ 이유둜 λΆˆν•„μš”ν•œ λžœλ”λ§μ΄ 일어날 수 μžˆλŠ”λ°, λΆˆν•„μš”ν•œ λžœλ”λ§μ€ μ„±λŠ₯에 문제λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

The Component Lifecycle

λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ 생λͺ…μ£ΌκΈ° λ©”μ†Œλ“œλ₯Ό 가지고 이 λ©”μ†Œλ“œλ“€μ€ νŠΉμ • μ‹œμ μ— μ‹€ν–‰ν•˜λ„λ‘ μ„€μ •ν•΄ 쀄 수 μžˆλ‹€.

mount

  • constructor()
    : μ»΄ν¬λ„ŒνŠΈμ˜ μƒμ„±μž λ©”μ†Œλ“œ, μ»΄ν¬λ„ŒνŠΈκ°€ μƒμ„±λ˜λ©΄ κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œ
constructor(props)
  • static getDerivedStateFromProps()
    : props둜 λ°›μ•„μ˜¨ 데이터λ₯Ό state에 λ„£μ–΄μ£Όκ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
    λ‹€λ₯Έ λ©”μ†Œλ“œμ™€ 달리 static이 ν•„μš”ν•˜κ³ , thisλ₯Ό μ‘°νšŒν•  수 μ—†λ‹€.
    이 λ©”μ†Œλ“œμ—μ„œ νŠΉμ • 객체λ₯Ό λ°˜ν™˜ν•˜κ²Œ 되면 ν•΄λ‹Ή 객체의 λ‚΄μš©λ“€μ΄ state둜 μ„€μ •λ˜κ³ , null을 λ°˜ν™˜ν•˜κ²Œ 되면 아무 일도 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
    μ»΄ν¬λ„ŒνŠΈκ°€ 처음 λžœλ”λ§ 되기 μ „κ³Ό λ¦¬λžœλ”λ§ 되기 전에 맀번 μ‹€ν–‰λœλ‹€.
static getDerivedStateFromProps(props, state)
  • render()
    : μ»΄ν¬λ„ŒνŠΈλ₯Ό λžœλ”λ§ν•˜λŠ” λ©”μ†Œλ“œ
render()
  • componentDidMount()
    : μ»΄ν¬λ„ŒνŠΈμ˜ 첫번째 λžœλ”λ§μ΄ λλ‚˜λ©΄ ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.
    이 λ©”μ†Œλ“œκ°€ 호좜 λ˜μ—ˆλ‹€λŠ” 것은 DOM이 화면에 λ‹€ 그렀진 μƒνƒœμ΄λ©°, DOM을 μ—°λ™ν•΄μ•Όν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ 데이터 μš”μ²­(axios, fetch λ“±), DOM 속성을 μ½κ±°λ‚˜ λ³€κ²½ν•΄μ•Όν•˜λŠ” μž‘μ—…μ„ ν•  수 μžˆλ‹€.
componentDidMount()

update

propsλ‚˜ stateκ°€ λ³€κ²½λ˜λ©΄ κ°±μ‹ ν•œλ‹€.

  • static getDerivedStateFromProps()
    : μ»΄ν¬λ„ŒνŠΈμ˜ propsλ‚˜ stateκ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ ν˜ΈμΆœλœλ‹€.
static getDerivedStateFromProps(props, state)
  • shouldComponentUpdate()
    : μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λžœλ”λ§μ„ 할지 κ²°μ •ν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.
    주둜 μ΅œμ ν™”μ— μ‚¬μš©λ˜λ©° React.memo와 역할이 λΉ„μŠ·ν•˜λ‹€.
    forceUpdate()λŠ” shouldComponentUpdateλ₯Ό λ¬΄μ‹œν•˜κ³  λžœλ”λ§ κ°•ν–‰ν•œλ‹€.
shouldComponentUpdate(nextProps, nextState)
  • render()
  • getSnapshotBeforeUpdate()
    : μ»΄ν¬λ„ŒνŠΈμ— λ³€ν™”κ°€ μΌμ–΄λ‚˜κΈ° 직전 DOM μƒνƒœλ₯Ό 가져와 νŠΉμ • 값을 λ°˜ν™˜ν•˜λ©΄ κ·Έλ‹€μŒ λ°œμƒν•˜κ²Œ λ˜λŠ” componenetDidUpdate() ν•¨μˆ˜μ—μ„œ 받아와 μ‚¬μš©ν•  수 μžˆλ‹€.
getSnapshotBeforeUpdate(prevProps, prevState)
  • componentDidUpdate()
    : λ¦¬λžœλ”λ§μ΄ 마치고 화면에 μ›ν•˜λŠ” λ³€ν™”κ°€ 반영된 ν›„ ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.
    μ„Έλ²ˆμ§Έ νŒŒλΌλ―Έν„°λ‘œ getSnapshotBeforeUpdateμ—μ„œ λ°˜ν™˜ν•œ 값을 μ‚¬μš©ν•  수 μžˆλ‹€.
componentDidUpdate(prevProps, prevState, snapshot)

unmount

μ»΄ν¬λ„ŒνŠΈκ°€ DOM μƒμ—μ„œ 제거될 λ•Œ ν˜ΈμΆœλœλ‹€.

  • componentWillUnmount()
    : μ»΄ν¬λ„ŒνŠΈκ°€ ν™”λ©΄μ—μ„œ 사라지기 직전에 ν˜ΈμΆœλœλ‹€.
    μ—¬κΈ°μ„œλŠ” 주둜 DOM에 직접 λ“±λ‘±ν–ˆλ˜ 이벀트λ₯Ό μ œκ±°ν•˜κ³  setTimeout 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ clearTimeout을 μ‚¬μš©ν•΄ μ œκ±°ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.
componentWillUnmount()

Other APIs

μœ„μ˜ 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œμ™€ 달리 μ•„λž˜μ˜ λ©”μ„œλ“œλ“€μ€ μ‚¬μš©μžκ°€ 직접 μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ 호좜 ν•  수 μžˆλ‹€.

setState()

  • setState()λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°±μ‹ ν•˜λŠ”λ° 즉각적 λͺ…령이 μ•„λ‹Œ μš”μ²­μ΄λ‹€.
  • λ¦¬μ•‘νŠΈλŠ” state의 λ³€ν™”λ₯Ό μ¦‰μ‹œ μ μš©ν•˜λŠ” 것을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μ—¬λŸ¬ 변경사항과 함꼐 μΌκ΄„μ μœΌλ‘œ κ°±μ‹ ν•˜κ±°λ‚˜ λ‚˜μ€‘μœΌλ‘œ λ―Έλ£° 수 μžˆλ‹€.
  • componentDidUpdate λ˜λŠ” setState의 μ½œλ°±μ„ μ‚¬μš©ν•΄ λ°”λ‘œ 값을 λ³€κ²½ν•  수 μžˆλ‹€.
  • shouldComponentUpdate()κ°€ falseλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ setState()λŠ” 항상 λžœλ”λ§μ„ λ°œμƒμ‹œν‚¨λ‹€.
this.setState((state, props) => {
  return {counter: state.counter + props.step};
});
  • updater ν•¨μˆ˜λ‘œ μ „λ‹¬λœ state와 propsλŠ” μ΅œμ‹ κ°’μ΄ 보μž₯되고 state에 μ–•κ²Œ λ³‘ν•©λœλ‹€.

forceUpdate()

  • μ»΄ν¬λ„ŒνŠΈμ˜ state λ˜λŠ” propsκ°€ λ³€κ²½λ˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ λ¦¬λžœλ”λ§ λ˜λŠ” 것이 κΈ°λ³Έ λ™μž‘μ΄λ‹€.
  • forceUpdate()λ₯Ό ν˜ΈμΆœν•˜λ©΄ render()κ°€ ν˜ΈμΆœλ˜λŠ”λ° shouldComponentUpdate()λŠ” λ¬΄μ‹œν•œλ‹€.
  • 보톡 render()Β λ‚΄μ—μ„œλŠ”Β forceUpdate()λ₯Ό μ‚¬μš©ν•˜μ§€ 말아야 ν•˜λ©°, 였직 this.props와 this.state의 κ°’λ§Œμ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

μ°Έκ³ 

https://reactjs.org/docs/react-component.html
https://react.vlpt.us/basic/25-lifecycle.html
https://velog.io/@sukong/REACT-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%9D%98-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0%EC%99%80-useEffect-Hook
https://medium.com/vingle-tech-blog/react-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f255d6569849

profile
μ •λ¦¬ν•˜κ³  κΈ°μ–΅ν•˜λŠ” κ³³

0개의 λŒ“κΈ€