React
useDeferredValue: lista che resta reattiva
useDeferredValue restituisce una copia in ritardo di un valore: il campo resta immediato e la lista pesante si aggiorna quando c'è tempo.
In sintesi
- useDeferredValue non aspetta un timer: React rimanda il render del valore differito e lo riprende appena può.
- Il valore differito aiuta solo se la parte costosa è memoizzata, altrimenti il genitore la rifà comunque.
- Il confronto fra valore immediato e differito segnala l'attesa senza aggiungere stato.
useDeferredValue restituisce una versione in ritardo di un valore: il testo digitato si vede subito, la lista che ne dipende si aggiorna quando il browser ha tempo. È il contrario di un debounce, perché non aspetta un timer.
La differenza da useTransition
useTransition decide quando parte un aggiornamento che controlli tu; useDeferredValue parte dal valore che hai già e non richiede di riscrivere il setter. Quando lo stato vive in un componente di terze parti, la seconda è l'unica opzione.
Il caso eseguibile
import { useDeferredValue, useMemo, useState } from "react";
import { ListaRighe } from "./ListaRighe";
export function Ricerca({ righe }) {
const [testo, setTesto] = useState("");
const differito = useDeferredValue(testo);
const attesa = testo !== differito;
const visibili = useMemo(
() => righe.filter((r) => r.includes(differito)),
[righe, differito],
);
return (
setTesto(e.target.value)} />
);
}
La lista legge il valore differito, l'input legge quello immediato. Il confronto fra i due valori accende l'indicatore di attesa senza uno stato in più, e sparisce da solo quando i due coincidono.
Perché serve la memo
Il valore differito evita il render della parte costosa solo se quella parte è memoizzata con memo. Senza memo il genitore si ridisegna, il figlio riceve props nuove e il lavoro pesante riparte comunque.
Record vivi nel catalogo
La categoria search raccoglie i campi di ricerca, con un command menu che filtra una lista; per un'attesa visibile c'è l'input di chat con stato di caricamento.
La limitazione
Non hai controllo sul ritardo: React decide in base al tempo disponibile, quindi non puoi promettere una risposta entro trecento millisecondi. Il valore differito non tocca la rete, non riduce il numero di richieste e non serve a niente su una lista non memoizzata.
Dove continuare
Le novità della versione sono in React 19, cosa cambia; la differenza con useTransition è in useTransition in pratica; le key nelle liste sono in il warning sulle key. Il confronto fra framework è in confronto framework frontend.
Domande frequenti
useDeferredValue sostituisce un debounce?
No. Un debounce aspetta un intervallo fisso prima di aggiornare; useDeferredValue non aspetta nulla e lascia a React la scelta del momento.
Perché la lista resta lenta?
Perché il componente della lista non è memoizzato, oppure perché il filtro viene ricalcolato a ogni render. Avvolgi la lista in memo e il calcolo in useMemo.
Il valore differito è sempre diverso da quello reale?
No, coincidono appena React completa il render differito. Il confronto fra i due è vero solo mentre l'aggiornamento è in coda.
Posso passare un secondo argomento?
Sì, in React 19 il secondo argomento è il valore iniziale usato al primo render. Serve quando il valore arriva da fuori e vuoi evitare un primo render con dati vecchi.
Serve per le richieste di rete?
No. useDeferredValue lavora sul render, non sulle richieste: per la rete servono cache, annullamento e una libreria dati.