✨ useCallback
: 콜백의 메모이제이션된 버전을 반환 , 콜백의 의존성이 변경 되었을 때에만 변경
불필요한 렌더링을 방지하기 위해 참조의 동일성에 의존적인 최적화된 자식 컴포넌트에 콜백을 전달할때 유용
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
import React, { useState, useCallback } from 'react';
const MyComponent = () => {
const [count, setCount] = useState(0);
// 콜백 함수 정의
const handleClick = useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []);
return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increase Count</button>
</div>
);
};
export default MyComponent;
✨ useRef
: .current 프로퍼티로 전달된 인자로 초기화된 변경 가능한 ref 객체를 반환 하는것, 반환된 객체는 컴포넌트 전 생애주기를 통해 유지된다.
컴포넌트에서 변경 가능한 변수를 생성하고, 이를 유지하는 데 사용됨. useRef를 사용하면 컴포넌트의 렌더링과 관계없이 변수를 계속해서 참조할 수 있다
const refContainer = useRef(initialValue);
import React, { useRef, useEffect } from 'react';
const MyComponent = () => {
const countRef = useRef(0);
useEffect(() => {
countRef.current++; // countRef 변수 변경
console.log(countRef.current); // 변경된 countRef 값 출력
}, []);
return <div>{countRef.current}</div>;
};
export default MyComponent;
✨ useMemo
: 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산 이 최적화는 모든 렌더링 시의 고비용 계산을 방지
useMemo 로 전달된 함수는 렌더링 중에 실행 된다. 렌더링 중에는 하지 않는 것을 useMemo 내에서 하지 말것
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
import React, { useMemo } from 'react';
const MyComponent = () => {
const expensiveResult = useMemo(() => {
// 계산 비용이 많은 연산 수행
return calculateExpensiveResult();
}, []);
return <div>{expensiveResult}</div>;
};
export default MyComponent;
훅은 아니지만...
✨ React.memo
: 리액트의 고차 컴포넌트(Higher-Order Component)로, 컴포넌트의 불필요한 리렌더링을 방지하기 위해 사용된다. React.memo는 컴포넌트를 감싸서 새로운 버전의 컴포넌트를 반환하며, 이 새로운 버전의 컴포넌트는 이전에 렌더링한 결과를 메모이제이션하여 동일한 props가 전달될 때 리렌더링을 방지
import React from 'react';
const MyComponent = React.memo((props) => {
// 컴포넌트의 렌더링 로직
return <div>{props.value}</div>;
});
export default MyComponent;
export default React.memo(EmotionItem);
이런식으로 감쌀수도 있음
요약하자면,
useMemo는 값을 메모이제이션하고 재사용하는 훅이며,
React.memo는 컴포넌트의 불필요한 리렌더링을 방지하여 성능을 최적화하는 고차 컴포넌트.
useMemo는 값을 계산하고 메모이제이션하는 데 사용되고,
React.memo는 컴포넌트의 리렌더링을 최적화하는 데 사용