Highlight updates when components render 사용
// React.memo 활용하여 컴포넌트 최적화
export default React.memo(DiaryEditor);
const DiaryEditor = ({ onCreate }) => {
useEffect(() => {
console.log("DiaryEditor 랜더");
});
App컴포넌트에서 data state의 초기값 = [] (랜더링 1)getData()함수에서 데이터를 받아오면 data state가 업데이트 되어 App 컴포넌트 리랜더 -> DiaryEditor는 App 컴포넌트에서 onCreate함수 전달받음 -> DiaryEditor 컴포넌트도 리랜더 (랜더링 2)onCreate()가 갖고 있는 데이터형 : 객체 이기 때문에, 얕은비교가 일어나서 React.memo를 사용했음에도 계속 다시 호출됨onCreate()onCreate()가 재생성되기 때문에 DiaryEditor 랜더됨주의 : onCreate()에 React.useMemo 사용 불가능
리액트 공식문서 참고
https://ko.reactjs.org/docs/hooks-reference.html#usecallback
const memoizedCallback = useCallback(
() => {// 첫번째 인자 : callback 함수
doSomething(a, b);
},
[a, b], // 두번째 인자 : dependency array
);
// App.js
// 일기 생성 함수
const onCreate = useCallback((author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current, // dataId의 초기값 = 0 , 현재 dataId의 값을 가져옴
};
dataId.current += 1; // dataId 사용 후, 현재값을 1씩 추가해주기
setData([newItem, ...data]);
}, []);


setData()전달 시, 새로운 state의 값으로 함수를 전달하는 것
const onCreate = useCallback((author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current, // dataId의 초기값 = 0 , 현재 dataId의 값을 가져옴
};
dataId.current += 1; // dataId 사용 후, 현재값을 1씩 추가해주기
setData([newItem, ...data]);
}, []);
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 함수형 업데이트
// data를 받아서 newItem을 추가한 ...date를 return하는 callback 함수 전달
setData((data)=>[newItem, ...data]);
}, []);
