질문: useEffect 로 componentDidMount 동작을 흉내내려면 어떻게 하지?
질문: 이펙트를 일으키는 의존성 배열에 함수를 명시해도 되는걸까?
useEffect
안에서만 선언useCallback
으로 감싸기질문: 왜 가끔씩 데이터 페칭이 무한루프에 빠지는걸까?
useCallback
을 써서 해결가능하다질문: 왜 가끔씩 이펙트 안에서 이전 state나 prop 값을 참조할까?
같은 useEffect
함수라도 각 렌더마다 다 다른 함수가 실행된다
[렌더링 예]
0
일 때의 UI를 보여줘.<p>You clicked 0 times</p>
가 있어.() => { document.title = 'You clicked 0 times' }
.() => { document.title = 'You clicked 0 times' }
를 실행하는 중.버튼 클릭시
1
로 변경해줘.1
일때의 UI를 줘.<p>You clicked 1 times</p>
가 있어.() => { document.title = 'You clicked 1 times' }
.() => { document.title = 'You clicked 1 times' }
를 실행하는 중.function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
console.log(`You clicked ${count} times`);
}, 3000);
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
// 순차적으로 누를시 1 2 3 4 5 이렇게 뜬다
...
componentDidUpdate() {
setTimeout(() => {
console.log(`You clicked ${this.state.count} times`);
}, 3000);
}
...
// 순차적으로 누를시 5 5 5 5 5 이렇게 뜬다
// this.state.count 는 언제나 최신의 값을 가리킨다
// 클래스형 컴포넌트는 전통적으로 타임아웃에서 잘못된 값을 가져오는 문제가 있다
// 이런 차이가 생기는 이유는 클로저 자체의 문제가 아닌 가변값 변경(mutation)이다
// 클래스형 컴포넌트에서는 this.state 가 최신 상태를 가리키도록 변경한다
// 클로저는 접근하려는 값이 절대 바뀌지 않을 때(상수) 유용하다
// 훅은 클로저에 많이 의존을한다