- lazy를 사용하면 처음 렌더링될 때까지 컴포넌트 코드의 로딩을 지연시킬 수 있다.
import { lazy } from 'react';
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
- 컴포넌트 외부에서 lazy를 호출하여 지연 로드된 React 컴포넌트를 선언한다.
매개변수
* load
- Promise 또는 다른 thenable(then 메서드를 가진 Promise와 유사한 객체)을 반환하는 함수이다.
- React는 반환된 컴포넌트를 처음 렌더링하려고 시도할 때까지 load를 호출하지 않는다.
- React는 load를 처음 호출한 후에는 resolve될 때까지 기다린 다음 resolve된 값을 React 컴포넌트로 렌더링한다.
- 반환된 Promise 및 Promise의 resolve된 값은 모두 캐시되므로 React는 load를 두 번 이상 호출하지 않는다.
- Promise가 reject되면 React는 가장 가까운 Error Boundary에 reject된 이유를 throw 한다.
- load 함수는 매개변수를 받지 않는다.
Lazy-loading components with Suspense(Suspense가 있는 지연 로딩 컴포넌트)
- lazy를 사용해서 컴포넌트 로드를 지연시키게 되면, 로드되는 동안 <Suspense>를 사용해서 표시될 내용도 지정해야 한다.
import { useState, Suspense, lazy } from 'react';
import Loading from './Loading.js';
const MarkdownPreview = lazy(() => delayForDemo(import('./MarkdownPreview.js')));
export default function MarkdownEditor() {
const [showPreview, setShowPreview] = useState(false);
const [markdown, setMarkdown] = useState('Hello, **world**!');
return (
<>
<textarea value={markdown} onChange={e => setMarkdown(e.target.value)} />
<label>
<input type="checkbox" checked={showPreview} onChange={e => setShowPreview(e.target.checked)} />
Show preview
</label>
<hr />
{showPreview && (
<Suspense fallback={<Loading />}>
<h2>Preview</h2>
<MarkdownPreview markdown={markdown} />
</Suspense>
)}
</>
);
}
// Add a fixed delay so you can see the loading state
function delayForDemo(promise) {
return new Promise(resolve => {
setTimeout(resolve, 2000);
}).then(() => promise);
}
- 위 예제에서는 lazy로 지정한 MarkdownPreview 컴포넌트가 로드될 때까지 Suspense fallback에 의해 Loading이 대신 표시된다.
My lazy component's state gets reset unexpectedly(lazy 컴포넌트의 상태가 예기치 않게 초기화 됩니다)
- lazy는 다른 컴포넌트의 내부가 아닌 항상 모듈의 최상위 레벨에서 선언해야 한다.
// 다른 컴포넌트 내부에 선언
import { lazy } from 'react';
function Editor() {
// 🔴 Bad: This will cause all state to be reset on re-renders
// 🔴 나쁨: 이렇게 하면 리렌더링시마다 모든 state가 초기화됩니다
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
// ...
}
// 모듈의 최상위 레벨에서 선언
import { lazy } from 'react';
// ✅ Good: Declare lazy components outside of your components
// ✅ 좋음: lazy 컴포넌트를 컴포넌트들의 밖에서 선언하세요
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
function Editor() {
// ...
}
* 참고 : React 공식문서(https://react-ko.dev/learn)
'이것저것 스터디📚 > React - 공식 문서' 카테고리의 다른 글
React 공식문서 -forwardRef (0) | 2023.09.20 |
---|---|
React 공식문서 -useRef (0) | 2023.09.20 |
React 공식문서 -<Suspense> (0) | 2023.09.13 |
React 공식문서 -memo (0) | 2023.09.07 |
React 공식문서 -useContext (0) | 2023.09.06 |