Lifecycle & useEffect(2)

무과장·2023년 8월 28일
0

react

목록 보기
30/30

지지난 포스트에서

  useEffect(()=>{
    setTimeout(()=>{ setAlert(false) }, 2000)
  }, [])

여기 마지막에 붙은 대괄호를 보았을 것이다.
저 대괄호의 용도는 뭐지?

useEffect(()=>{ 실행할코드 }, [count])

useEffect()의 둘째 파라미터로 대괄호를 넣을 수 있는데 거기에 변수나 state같은 것들을 넣을 수가 있다.
그렇게 하면 [ ]에 있는 변수나 state가 변할 때만 useEffect 안의 코드를 실행해준다.
그러므로 위의 코드는 count라는 변수가 변할 때만 useEffect 안의 코드가 실행시킬 것이다.
*[ ] 안에 state는 여러개 넣을 수 있다.

useEffect(()=>{ 실행할코드 }, [])

위처럼 아무것도 넣지 않으면 컴포넌트 mount시 (로드 시) 1회 실행하고 영영 실행해주지 않는다.

▶[ ]가 없을 때

count state(노란색 버튼을 누르면 +1이 됨)가 변하든 말든 console창에 렌더링이라는 글자가 찍히지 않는다.

▶[ ]가 있을 때

count state(노란색 버튼을 누르면 +1이 됨)가 변하면 console창에 렌더링이라는 글자가 찍힌다.

이해 완료! 이제 다른 기능을 배워보자

clean up function

useEffect 동작하기 전에 특정코드를 실행하고 싶으면 return ()=>{} 안에 넣을 수 있다.

useEffect(()=>{ 
  그 다음 실행됨 
  return ()=>{
    여기있는게 먼저실행됨
  }
}, [count])

useEffect 안에 있는 코드를 실행하기 전 return ()=>{ } 안에 있는 코드를 실행해줌.

이걸 언제 쓰면 좋으냐?
예를 들어 setTimeout 타이머를 쓴다고 가정하면 setTimeout() 쓸 때마다 브라우저 안에 타이머가 하나 생긴다.
근데 useEffect 안에 썼기 때문에 컴포넌트가 mount 될 때 마다 실행된다.
그럼 잘못 코드를 짜면 타이머가 100개 1000개 생길 수도 있게 되고
이런 버그를 방지하기 위해 useEffect에서 타이머 만들기 전에 기존 타이머를 싹 제거하라고 코드를 짤 수 있다.

useEffect(()=>{ 
  let a = setTimeout(()=>{ setAlert(false) }, 2000)
  return ()=>{
    clearTimeout(a)
  }
}, [])

참고1. clean up function에는 타이머제거, socket 연결요청제거, ajax요청 중단 이런 코드를 많이 작성한다.
참고2. 컴포넌트 unmount 시에도 clean up function 안에 있던게 1회 실행된다.

profile
느리더라도 꾸준히 확실하게.

0개의 댓글

관련 채용 정보