lazy ti permette di posticipare il caricamento del codice del componente fino alla sua prima renderizzazione.
const SomeComponent = lazy(load)Reference
lazy(load)
Chiama lazy fuori dai tuoi componenti per dichiarare un componente React con lazy loading:
import { lazy } from 'react';
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));Parameters
load: Una funzione che restituisce una Promise o un altro thenable (un oggetto simile a una Promise con un metodothen). React non chiameràloadfino al primo tentativo di renderizzare il componente restituito. Dopo la prima chiamata aload, React attenderà che venga risolta e poi renderizzerà la proprietà.defaultdel valore risolto come componente React. Sia la Promise restituita sia il valore risolto della Promise verranno memorizzati in cache, quindi React non chiameràloadpiù di una volta. Se la Promise viene rifiutata, Reactthrowerà il motivo del rifiuto affinché lo gestisca il contenitore di errori più vicino.
Returns
lazy restituisce un componente React che puoi renderizzare nel tuo albero. Mentre il codice del componente lazy è ancora in caricamento, il tentativo di renderizzarlo lo farà andare in sospensione. Usa <Suspense> per mostrare un indicatore di caricamento mentre è in caricamento.
Funzione load
Parameters
load non riceve parametri.
Returns
Devi restituire una Promise o un altro thenable (un oggetto simile a una Promise con un metodo then). Deve risolversi infine in un oggetto la cui proprietà .default è un tipo componente React valido, come una funzione, un componente memo o un componente forwardRef.
Usage
Lazy-loading dei componenti con Suspense
Di solito, importi i componenti con la dichiarazione statica import:
import MarkdownPreview from './MarkdownPreview.js';Per posticipare il caricamento del codice di questo componente fino alla sua prima renderizzazione, sostituisci questa importazione con:
import { lazy } from 'react';
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));Questo codice si basa su import() dinamico, che potrebbe richiedere il supporto del tuo bundler o framework. Usare questo pattern richiede che il componente lazy che importi sia l’export default del modulo.
Ora che il codice del tuo componente si carica on demand, devi anche specificare cosa mostrare mentre è in caricamento. Puoi farlo avvolgendo il componente lazy o uno dei suoi genitori in un boundary <Suspense>:
<Suspense fallback={<Loading />}>
<h2>Anteprima</h2>
<MarkdownPreview />
</Suspense>In questo esempio, il codice di MarkdownPreview non verrà caricato finché non tenti di renderizzarlo. Se MarkdownPreview non si è ancora caricato, al suo posto verrà mostrato Loading. Prova a selezionare la checkbox:
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)} /> Mostra anteprima </label> <hr /> {showPreview && ( <Suspense fallback={<Loading />}> <h2>Anteprima</h2> <MarkdownPreview markdown={markdown} /> </Suspense> )} </> ); } // Aggiungi un ritardo fisso per poter vedere l'indicatore di caricamento function delayForDemo(promise) { return new Promise(resolve => { setTimeout(resolve, 2000); }).then(() => promise); }
Questa demo usa un ritardo artificiale. La prossima volta che deselezioni e selezioni di nuovo la checkbox, Anteprima sarà in cache, quindi non ci sarà alcun indicatore di caricamento. Per vedere di nuovo l’indicatore di caricamento, fai clic su “Reset” nella sandbox.
Scopri di più sulla gestione degli stati di caricamento con Suspense.
Troubleshooting
Lo state del mio componente lazy viene resettato in modo imprevisto
Non dichiarare componenti lazy all’interno di altri componenti:
import { lazy } from 'react';
function Editor() {
// 🔴 Sbagliato: questo farà resettare tutto lo state alle ri-renderizzazioni
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
// ...
}Dichiarali invece sempre al top level del tuo modulo:
import { lazy } from 'react';
// ✅ Corretto: dichiara i componenti lazy fuori dai tuoi componenti
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
function Editor() {
// ...
}