const MyComponent = React.memo(function MyComponent({ value }) {
console.log("렌더링 됨");
return <div>{value}</div>;
});
import { useCallback } from 'react';
function Parent() {
const handleClick = useCallback(() => {
console.log("클릭!");
}, []); // [] 안의 값이 안 바뀌면 함수도 안 바뀜
return <Child onClick={handleClick} />;
}
import { useMemo } from 'react';
function MyComponent({ list }) {
const expensiveResult = useMemo(() => {
console.log("계산 다시 함");
return list.filter(item => item.active);
}, [list]); // list가 바뀔 때만 다시 계산됨
return <div>{expensiveResult.length}</div>;
}
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>로딩 중...</div>}>
<MyComponent />
</Suspense>
);
}
React.lazy() : 컴포넌트를 동적으로 import
Suspense : 로딩되는 동안 보여줄 대체 UI 지정
fallback={<div>로딩 중</div>} : 로딩 중 잠깐 보여줄 내용
초기 로딩 시간이 길어지는 경우
초기 로드 시 필요한 핵심 코드만 로드하고 이후에 필요할 때 로드하도록 설정
라우트별 코드 분할이 필요한 경우
SPA에서는 각 페이지가 별도의 기능과 UI를 가지기 때문에 라우트별로 필요한 코드만 분리해서 로드할 수 있다. 리액트의 React.lazy와 Suspense를 사용해서 라우트별 컴포넌트를 동적으로 불러올 때 유용하다.