[React] 컴포넌트의 변화에 따른 작업 처리 #useEffect()
- 프론트/리액트
- 2024. 8. 27.
💡 useEffect()
const [count, setCount] = useState(1);
const handleCountUpdate = () => {
setCount(count + 1);
}
const handleInputChange = (e) => {
setName(e.target.value);
}
/* 대충 다른 코드들 */
return (
<button onClick={handleCountUpdate}>추가</button>
<span>count: {count}</span>
<input type="text" value={name} onChange={handleInputChange} />
<span>name: {name}</span>
)
`count`와 `name` 값이 이벤트에 따라 handle 함수들에 의해 업데이트되는 저런 코드가 대충 존재함. 저렇게 업데이트 되거나, 마운트(최초 렌더링)되거나, 마운트가 해제되었을 때 실행되는 것이 `useEffect()` 임
사용 예시 (1) - 모든 state의 변경에 대해 실행
const handleCountUpdate = () => {
setCount(count + 1);
}
const handleInputChange = (e) => {
setName(e.target.value);
}
// useEffect 기본 문법
useEffect(() => {
console.log('모든 state의 변경에 대해 실행')
})
`count`와 `name` 값이 변경되면 useEffect() 내부의 로직이 실행됨. 즉, 버튼을 눌러 `count` 값이 업데이트 되거나, onChange로 인해 `name`값이 업데이트 될 때마다 실행됨. 첫 번째 인자로 콜백함수를 전달
사용 예시 (2) - 특정 state의 변경에 대해 실행
const handleCountUpdate = () => {
setCount(count + 1);
}
const handleInputChange = (e) => {
setName(e.target.value);
}
useEffect(() => {
console.log('count 가 변경될떄마다', count)
}, [count])
useEffect()의 두 번째 인자로는 배열을 넘겨줄 수 있다(선택). state를 배열에 넣어 전달하면 되고, 배열에 담긴 state가 업데이트 되는 경우에 한해서만 실행된다.
사용 예시 (3) - 컴포넌트가 마운트 될 때만 실행 (최초 1회)
useEffect(() => {
console.log('마운팅 될 때만 (최초 1회)')
}, [])
컴포넌트가 최초 1회 렌더링 될 때만 실행됨 (초기 설정할 때 쓰면 될듯?)
💡 실제 동작 원리
그래서 배열에 state를 넣어주면 왜 해당 state에 대해서만 실행이 될까라는 의문이 들 수 있다. 사실 useEffect는 내부적으로 배열로 들어온 값이 이전과 같은지 비교한다. 그러니까 `count`라는 값을 배열로 전달하고 `setCount` 로 값을 변경하면 useEffect가 이전 `count`와 변경된 `count`를 비교해서 값이 달라졌으면 실행해준다.
- 두 번째 인자로 아무 값도 넣어주지 않으면 비교할게 없기 때문에 어떤 state가 변하더라도 무조건 실행한다.
- 빈배열`[]`을 넣어주면 최초 1회만 실행
- 배열이 비어있으면 무조건 한 번은 실행됨
- 그리고 이전과 항상 같은 상태 (`undefined`) 를 유지하기 때문에 업데이트가 발생하지 않음
- 특정 state값을 넣을 경우 그 값이 변경되면 이전과 비교해서 실행한다.
'프론트 > 리액트' 카테고리의 다른 글
[React] 반복문으로 컴포넌트를 호출할 때 `key` (0) | 2024.08.29 |
---|---|
[React] 일반형 & 함수형 업데이트 #useState (0) | 2024.08.28 |
[React] Lazy initialization 지연 초기화 #useState 초기값 (0) | 2024.08.26 |
[React교양] state값을 변경할 때 이전이랑 같으면 렌더링하지 않는다. (0) | 2024.08.20 |
[React] 개발환경 세팅 #튜토리얼 (0) | 2024.08.19 |