Implementare manualmente gli aggiornamenti ottimistici
Applicare localmente lo stato ottimistico, accodare la mutation e gestire esplicitamente i casi di successo e fallimento
Implementare manualmente gli aggiornamenti ottimistici è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.
Lo stato prima della mutazione
Gli aggiornamenti ottimistici manuali iniziano dallo stato locale del componente, inizializzato con i dati del server: const [items, setItems] = useState(serverItems). Questo stato locale è quello che viene visualizzato ed è quello che verrà modificato ottimisticamente. NON si devono modificare direttamente i dati recuperati dal server: è opportuno mantenere una copia locale sotto il proprio controllo.
La fase dell'aggiornamento ottimistico
Quando l'utente avvia una mutazione (facendo clic su "Aggiungi", "Mi piace" o "Elimina"), si esegue immediatamente l'aggiornamento dello stato prima di chiamare l'API: setItems(prev => [...prev, newItem]). La UI riflette subito la modifica. Solo dopo questo aggiornamento si invia la richiesta di rete effettiva.
Acquisire lo stato precedente
Prima di eseguire l'aggiornamento ottimistico, si acquisisce lo stato corrente: const previousItems = items. Questa istantanea è il punto di destinazione del rollback. Se la chiamata API fallisce, si ripristina questo valore. È opportuno memorizzarlo in una variabile (non nello stato), perché serve solo per la durata della mutazione in sospeso.
Eseguire la chiamata API
Dopo l'aggiornamento ottimistico, si esegue la chiamata API in modo asincrono. La si racchiuda in try/catch. In caso di successo, è possibile eseguire nuovamente il recupero dei dati per sincronizzarsi con lo stato del server oppure considerare attendibile lo stato ottimistico, se il server restituirebbe gli stessi dati. In caso di errore, si utilizza lo stato precedente acquisito per il rollback.
Rollback in caso di errore
Nel blocco catch della mutazione: setItems(previousItems). In questo modo lo stato torna a quello precedente all'aggiornamento ottimistico. Dopo il rollback, si mostri una notifica di errore. Gli utenti comprendono che gli errori rari possono verificarsi: ciò che non possono accettare è un'incoerenza silenziosa.
Mostrare un toast di errore
Dopo il rollback, si mostri un messaggio di errore: "Impossibile salvare le modifiche. Riprovare." con un pulsante Riprova che esegua nuovamente la stessa mutazione. In questo modo si lascia il controllo agli utenti. La combinazione di rollback, toast di errore e possibilità di riprovare gestisce il caso di errore con eleganza senza bloccare l'intera UI.
Il problema degli ID temporanei
Quando si aggiunge ottimisticamente un nuovo elemento, il server non gli ha ancora assegnato un ID reale. Si crei un ID temporaneo per l'elemento ottimistico: const tempId = crypto.randomUUID(). Lo si utilizzi come chiave dell'elemento nell'elenco. Dopo una risposta positiva dell'API, si sostituisca l'ID temporaneo con quello reale assegnato dal server.
Riconciliare gli ID temporanei
Dopo una mutazione di creazione riuscita, il server restituisce l'ID reale. Si aggiorni lo stato sostituendo l'elemento temporaneo: setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item)). Questa riconciliazione garantisce che le operazioni successive utilizzino l'ID corretto del server.
Il problema delle condizioni di gara
Se l'utente avvia due mutazioni in rapida successione, le risposte possono arrivare fuori ordine. La risposta della seconda mutazione potrebbe arrivare prima di quella della prima, e il rollback della prima potrebbe sovrascrivere lo stato corretto prodotto dalla seconda. Questa è una condizione di gara tipica della UI ottimistica.
Serializzare le mutazioni per evitare le race condition
Una soluzione alle race condition consiste nel serializzare le mutazioni usando una coda. Mentre una mutazione è in corso, disabiliti il pulsante che la attiva (impostando lo stato isSubmitting su true). Consenta la mutazione successiva solo dopo il completamento della precedente. Questo riduce in parte la reattività, ma garantisce il corretto ordine degli aggiornamenti dello stato.
Pattern di eliminazione ottimistica
Per le operazioni di eliminazione: salvi gli elementi precedenti, filtri dallo stato l'elemento eliminato, chiami l'API di eliminazione ed esegua il rollback in caso di errore. L'eliminazione è più semplice della creazione (non richiede la riconciliazione degli ID), ma gli stessi principi restano validi. Valuti la possibilità di aggiungere un breve ritardo prima dell'eliminazione (mostrando un'opzione "annulla") prima di effettuare la chiamata API.
ID temporaneo negli aggiornamenti ottimistici
Perché agli elementi aggiunti in modo ottimistico serve un ID temporaneo?
Riepilogo della lezione: aggiornamenti ottimistici manuali
Il pattern manuale: salvi previousItems, imposti lo stato con setItems usando il nuovo stato, effettui la chiamata API, esegui il rollback in caso di errore con setItems(previousItems) e mostri un errore. Per le aggiunte, usi crypto.randomUUID() come ID temporaneo e riconcili l'ID con quello del server in caso di successo. Previeni le race condition disabilitando il trigger durante le mutazioni in corso. Rollback + toast + retry è la UX standard in caso di errore.
Domande Frequenti
La lezione «Implementare manualmente gli aggiornamenti ottimistici» è gratuita?
Sì — il testo completo di «Implementare manualmente gli aggiornamenti ottimistici» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.
Cosa imparerò in «Implementare manualmente gli aggiornamenti ottimistici»?
Applicare localmente lo stato ottimistico, accodare la mutation e gestire esplicitamente i casi di successo e fallimento Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare React Academy?
Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Implementare manualmente gli aggiornamenti ottimistici»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione React Academy?
Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Che cos'è una UI ottimistica e quando usarla
- Implementare manualmente gli aggiornamenti ottimistici
- Rollback in caso di errore e risoluzione dei conflitti
- Pattern ottimistici con React Query e Zustand