메모이제이션(최적화)된 콜백
을 반환
그 메모이제이션(최적화)된 버전은 콜백의 의존성이 변경되었을 때에만 변경된다.
즉, 두번째 인자로 들어오는 배열이 변화하지 않으면, 첫번째 인자로 들어온 콜백함수를 재사용할 수 있게 해준다.
App.js가 초기 렌더링 되면서
DiaryEditor의 state가 변경되지 않았음에도 렌더링
이 일어나는 현상이 있다.
또한, 일기List가 삭제 될때
에도 DiaryEditor는 변화하지 않았음에도리렌더
가 된다.
불필요한 컴포넌트의 런데링을 최적화할 필요가 있다.
DiaryEditor 컴포넌트
가 리렌더링 되게 하는 요인은props로 받는 onCreate함수
가 App.js가 리렌더링 되면서다시 선언
되기 때문에 그때마다 props가 변화되어 DiaryEditor 컴포넌트가 리렌더링 되고 있다.
onCreate
는 DiaryEditor컴포넌트
에 함수의 형태의 prop으로 전달되어야 하기 때문에 사용하기엔 적합하지 않다.useCallback()
을 사용해 함수형태로 전달하되, 최적화된 형태의 함수로 전달 할 수 있다.const onCreate = useCallback((author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current,
}
dataId.current += 1;
setData([newItem, ...data]);
}, []);
❗ 매개변수의 값은 아무것도 주지 않은 상태에서 usecallback()함수 안에 있는 콜백함수가 선언된 시점의 상태(state값이 선언된 시점<초기화값>의 값)
가 되어 변화된 값을 얻지 못해 업데이트를 할 수 없는 현상이 일어난다.
이러한 현상을 막고자 state의 상태 변화함수
에 함수형 엡데이트
를 해주게 되면 최신의 state를 받아 렌더링 할 수 있다.
setData((data) => [newItem, ...data]);
data의 값(실행된 시점의 data값)
을 화살표 함수의 매개변수
로 받고 [newItem, ...data]에 data로 들어가게 되면서 state에 다시 값으로 변화
시키게 된다.
useMemo()
: 값을 반환;
React.memo()
: 컴포넌트를 반환
sueCallback()
: 최적화된 콜백함수를 반환