0Pricing
React Academy · Lezione

Il problema delle sottoscrizioni a store esterni

Comprenda il tearing e perché le sottoscrizioni con useState o useRef a store esterni non siano sicure in React concorrente.

Il problema delle sottoscrizioni a store esterni è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Cos'è uno store esterno

Uno store esterno è qualsiasi fonte di stato che risiede al di fuori dell'albero React, come uno store Redux, un'API del browser come matchMedia o un semplice oggetto a livello di modulo dotato di un proprio meccanismo di sottoscrizione.

React non possiede questo stato, quindi deve sottoscriversi ai cambiamenti e leggere gli snapshot per mantenere i componenti sincronizzati con ciò che lo store contiene al momento.

La sottoscrizione ingenua con useState + useEffect

Un approccio comune legge il valore dello store in useState e poi usa useEffect per sottoscriversi e chiamare setState ogni volta che lo store cambia. In apparenza, questo sembra mantenere aggiornato il componente.

Funziona con un rendering sincrono semplice, ma presenta un difetto sottile che diventa evidente quando React esegue il rendering concorrente e può mettere in pausa o riavviare il lavoro a metà.

Il problema del tearing

Il tearing si verifica quando parti diverse dell'interfaccia mostrano valori diversi dello stesso store durante un singolo passaggio di rendering. Il rendering concorrente può interrompere e riprendere il lavoro e, nel frattempo, lo store può cambiare.

Il risultato è una schermata incoerente, in cui un componente mostra il vecchio valore e un altro quello nuovo: un'incoerenza di fatto impossibile prima delle funzionalità concorrenti.

Esempio: tearing con la modalità scura durante il rendering

Immagini molti componenti che leggono uno store del tema mentre React esegue il rendering concorrente. Se l'utente attiva la modalità scura a metà del processo, i componenti renderizzati prima dell'attivazione mostrano il tema chiaro, mentre quelli successivi mostrano quello scuro.

Per un frame ci si ritrova con una schermata in parte chiara e in parte scura, perché il valore dello store è cambiato durante un rendering che React non ha trattato in modo atomico.

Perché useEffect arriva troppo tardi

Gli effetti vengono eseguiti dopo il commit del rendering, quindi una sottoscrizione basata su useEffect non può garantire che il valore letto durante il rendering corrisponda allo store al momento del commit. La sottoscrizione si attiva troppo tardi per impedire una visualizzazione incoerente.

Quando l'effetto si sottoscrive nuovamente e aggiorna lo stato, il frame incoerente potrebbe essere già stato mostrato all'utente.

useMutableSource, API deprecata

Una precedente API sperimentale chiamata useMutableSource tentava di risolvere il problema delle letture esterne sicure durante il rendering concorrente, ma la sua API si è rivelata difficile da usare correttamente e non è mai stata rilasciata come stabile.

Il team di React l'ha sostituita con una primitiva più semplice ed ergonomica, che offre le stesse garanzie di coerenza senza le insidie dell'API precedente.

useSyncExternalStore come soluzione

useSyncExternalStore è l'hook ufficiale per sottoscriversi agli store esterni in modo sicuro durante il rendering concorrente. Coordina le operazioni con React affinché le letture rimangano coerenti durante un rendering e non si verifichi tearing nei componenti.

È diventato il primitivo consigliato per gli autori di librerie che devono integrare in modo affidabile lo stato esterno in React durante il rendering concorrente.

Quali librerie ne sono state interessate

Le librerie di gestione dello stato che si sottoscrivono a store esterni sono state direttamente interessate, tra cui Redux, MobX e Valtio. Ognuna ha dovuto adottare la nuova primitiva per rimanere sicura dopo l'introduzione delle funzionalità concorrenti.

Per questo motivo i relativi binding per React sono stati aggiornati per chiamare internamente useSyncExternalStore, invece di affidarsi al precedente schema useState più useEffect.

Snapshot coerente e sicurezza nel rendering concorrente

L’hook garantisce che ogni componente che legge lo store durante un rendering veda lo stesso snapshot e forza un nuovo rendering sincrono se lo store cambia in un modo che altrimenti causerebbe tearing.

Questa combinazione di snapshot coerente e sicurezza nel rendering concorrente è il valore principale che l’hook offre rispetto alle sottoscrizioni implementate manualmente.

Una primitiva a prova di futuro

Utilizzando useSyncExternalStore, le sottoscrizioni rimangono corrette man mano che React evolve il proprio modello di rendering. Si scelgono le garanzie del framework invece di reimplementarle in modo imperfetto.

Questo lo rende il modo più solido e raccomandato per collegare qualsiasi fonte esterna di verità ai componenti React.

Verifica rapida: il problema del tearing

Verifichi che cosa significa tearing nel rendering concorrente.

Riepilogo: problemi delle sottoscrizioni agli store esterni

Gli store esterni vivono al di fuori di React e la sottoscrizione ingenua con useState e useEffect non può impedire il tearing quando il rendering è concorrente. Gli effetti vengono eseguiti troppo tardi per mantenere coerenti le letture all’interno di un rendering.

useSyncExternalStore sostituisce useMutableSource, ormai abbandonato, e offre uno snapshot coerente con sicurezza nel rendering concorrente. Librerie come Redux, MobX e Valtio lo hanno adottato come primitiva a prova di futuro per le sottoscrizioni agli store.

Domande Frequenti

La lezione «Il problema delle sottoscrizioni a store esterni» è gratuita?

Sì — il testo completo di «Il problema delle sottoscrizioni a store esterni» è 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 «Il problema delle sottoscrizioni a store esterni»?

Comprenda il tearing e perché le sottoscrizioni con useState o useRef a store esterni non siano sicure in React concorrente. 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 1 di 4.

Quanto tempo richiede la lezione «Il problema delle sottoscrizioni a store esterni»?

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

  1. Il problema delle sottoscrizioni a store esterni
  2. API e parametri di useSyncExternalStore
  3. Sottoscrizione alle API del browser
  4. Creare uno store personalizzato con useSyncExternalStore
← Torna a React Academy