메모이제이션(최적화)된 콜백을 반환
그 메모이제이션(최적화)된 버전은 콜백의 의존성이 변경되었을 때에만 변경된다.
즉, 두번째 인자로 들어오는 배열이 변화하지 않으면, 첫번째 인자로 들어온 콜백함수를 재사용할 수 있게 해준다.
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(): 최적화된 콜백함수를 반환