일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바스크립트코딩테스트
- 자바스크립트 알고리즘 문제
- 리액트
- 자바스크립트 연결리스트
- 자바스크립트 알고리즘
- CSS
- 리액트쿼리
- til
- HTML
- next13
- Next
- NPM
- 자바스크립트 문제풀이
- 프론트엔드
- 제로베이스
- leetcode문제풀이
- JavaScript
- stack문제
- 자바스크립트 문제
- 타입스크립트
- Next.js13
- 프로그래머스
- Baekjoon
- JS
- leetcode
- 알고리즘문제풀이
- 자바스크립트 문제 풀이
- lodash
- 자바스크립트
- react
- Today
- Total
코드노트
REACT Hooks 노트 useEffect 정리 본문
useEffect
- 리액트 컴포넌트가 렌더링이 될 때, 될 때마다 특정 작업을 실행할 수 있는 리액트 hook이다.
- mount : 화면에 첫 렌더링
- Update : 리렌더링
- Unmount : 화면에서 사라질 때
이 3개의 상황에서 useEffect 내부에 있는 코드가 실행된다고 생각하면 된다.
- useEffect는 2개의 인자를 받는다.
- 첫번째는 콜백함수, 두번째는 배열( [], dependency array )을 받는다. 그래서 일반적으로 두가지 사용법이 있다.
useEffect(() => {
})
- 컴포넌트가 화면에 처음 렌더링 될때,
- 컴포넌트가 리렌더링이 될때
useEffect(() => {
}, [value])
- 컴포넌트가 화면에 처음 렌디링이 될때,
- [value]배열안에 들어있는 값이 바뀔때 실행
useEffect(() => {
}, [])
- 화면에 처음 렌더링 될때만 실행
- 그 후에는 실행되지 않음
useEffect내부에 코드를 종료시키거나 타이머 또는 event를 종료시킬때에는? = Clean Up
useEffect(() => {
// 곽튜브 구독
return () => {
// 곽튜브 구독 해제
}
}, [value])
- return 값으로 함수를 넣어주면 된다.
- Unmount 또는 useEffect가 리렌더링 되기 전에 종료시킨다.
- useEffect 내부에는 현재 console.log로 "렌더링"문자가 호출된다.
- count, input이 변화가 되면 렌더링이 계속된다.
- 이와 같이 렌더링이 될때마다 useEffect는 내부에 있는 코드가 재실행되는 것이다.
그럼 count에서만 useEffect함수가 실행하게 하려면 어떻게 해야할까?
바로 두번째 인자인 []배열안에 변화하는지 감시하도록 count를 넣어주면된다.
그럼 이제 count값이 변화할때마다 console에는 "렌더링"이 나오지만
input에 입력할때는 console이 나오지 않는다.
Clean up
const Timer = () => {
useEffect(() => {
const timer = setInterval(() => {
console.log("타이머")
}, 1000)
}, [])
};
- 만약 이렇게 useEffect를 사용하게 되면 timer는 화면에 처음 렌더링이 될때 1초씩 타이머가 돌아가게된다.
- 여기서 []을 넣었기 때문에 화면에 처음 렌더링 될때만 실행이 되지만 새로 리렌더링이 되더라도 타이머는 멈추지 않는다.
- Unmount가 될때 = 화면에서 사라질 때 return 으로 setInterval을 종료시키는 함수를 넣어주어야한다.
const Timer = () => {
useEffect(() => {
const timer = setInterval(() => {
console.log("타이머")
}, 1000)
return () => {
clearInterval(timer)
}
}, [])
}
- 이렇게 return에 clearInterval을 통해서 타이머를 멈추는 코드를 넣어주게 되면!
- useEffect가 처음 렌더링 될때는 타이머가 시작되고 화면에서 사라지게 되면 return을 통해서 타이머는 멈추게 된다.
- return을 통해서 종료시키지 않는다면 현재코드에서는 console에 "타이머"는 1초간격으로 계속 나오게 된다.
- 복잡한 로직이나 긴 코드 함수가 종료되지않고 계속 실행될 수 있다는걸 잊지말자.
'Code note > 리액트' 카테고리의 다른 글
REACT Hooks 노트 React.memo (feat.useMemo, useCallback) (0) | 2023.04.02 |
---|---|
REACT Hooks 노트 useReducer 정리 (0) | 2023.03.16 |
REACT Hooks 노트 custom hook (form control) (0) | 2023.03.13 |
REACT Hooks 노트 useContext + Context API 정리 (1) | 2023.03.11 |
REACT Hooks 노트 useRef 정리 (0) | 2023.03.05 |