🙆♂️ 이 경우 useMemo를 사용하여 numbers state의 값(의존성 배열)이 변할 때만 콜백함수를 실행할 수 있도록 개선할 수 있습니다.
const sum = useMemo(() => expensiveCalculate(numbers), [numbers]);
⚠️ useMemo는 값을 저장하는 함수이기 때문에 위 코드처럼 expensiceCalculate(numbers)를 useMemo로 감싸주었습니다. 함수를 저장하고 싶을 때는 useCallback를 사용할 수 있습니다.
2️⃣ 참조 동일성 유지
참조 동일성 유지를 설명하기 전에 React.memo에 대한 설명이 필요할 것 같습니다.
두 개의 부모, 자식 관계의 컴포넌트가 있다고 했을 때 부모 컴포넌트에는 todo와 something이라는 state가 있고, 자식 컴포넌트에서는 todo만 props로 전달받은 상태입니다.
🧐 자식 컴포넌트에 있는 "I am child"라는 console은 todo state의 값이 변하면 같이 렌더링 될까요? (todo가 rprops로 연결되어 있는 상태) 🧐 자식 컴포넌트에 있는 "I am child"라는 console은 something state의 값이 변하면 같이 렌더링 될까요? (아무것도 연결되어 있지 않은 상태)
import React from "react";
function Detail({ todo }) {
console.log("I am child");
return <div>{todo}</div>;
}
export default React.memo(Detail);
⚠️ React.memo 사용 시 주의할 점은 아래처럼 객체 형태에 customTodo를 Child 컴포넌트에 props로 넘겨주는 경우 React.memo의 기능이 정상적으로 작동하지 않을 수 있습니다.왜냐하면 React.memo는 원시형 타입(string, number, boolean 등 온전한 값 자체)은 이해할 수 있지만, 참조형 타입(객체, 배열처럼 다양한 타입의 여러 개의 값이 하나로 묶여 저장되어 있는 주소를 참고하는 형태)은 주소값의 변화를 감지하고 있기 때문에 관련 없는 state의 변화에도 주소값이 변화되었다고 인식하여 자식 컴포넌트가 렌더링 되는 것입니다.
👉 그렇기 때문에 useMemo가 참조값 동일성 유지를 해줄 수 있습니다.
아래처럼 주소값을 갖는 customTodo를 useMemo로 감싸주면 todo 값이 변할 때만 커스텀 된 값이 return 되기 때문에 참조값을 동일하게 유지시킬 수 있습니다!
댓글