Argomento
- #React useState
- #DOM virtuale
- #deepdive
- #React Hooks
- #React
Creato: 2024-03-14
Creato: 2024-03-14 01:53
Stranamente, l'ambiente React adora le cose con 'use' attaccato.
useServer, useCallback, useState, useMemo, ecc.
Anche gli hook personalizzati hanno tutti 'use' attaccato.
Da dove è iniziato?
useState è un hook famoso.
Memorizza i valori dello stato e, quando cambiano, esegue il re-rendering. È molto semplice.
È l'esempio che tutti conoscono.
Solo il tag p? O anche il tag button?
La risposta è che l'intero componente in cui useState è chiamato viene re-renderizzato.
ExampleComponent viene re-renderizzato, ma
si dice che utilizzi il Virtual DOM per confrontare i valori e modificare solo le parti diverse del DOM.
La risposta sta nella struttura di useState.
Questo è il codice reale di useState di React.
Ottiene il dispatcher dall'oggetto globale ed esegue useState.
Da questo non si capisce la struttura.
Scavando più a fondo, troviamo il seguente codice.
Ottiene l'hook e assegna la funzione set direttamente alla coda (queue) dell'hook tramite bind.
(bind lega this alla funzione esistente, utilizza gli altri argomenti come argomenti della funzione e restituisce una nuova funzione con this legato).
Neanche così si riesce a capire il motivo.
Scaviamo ancora più a fondo.
Si può vedere che il valore iniziale viene assegnato ogni volta. Questo non spiega come lo stato venga mantenuto.
Scaviamo ancora più a fondo. L'hook sembra sospetto.
currentlyRenderingFiber e workInProgressHook sono variabili globali.
Utilizzando l'assegnazione da destra a sinistra, implementa una linked list.
Quindi, si prevede che l'hook abbia la seguente struttura.
I valori vengono aggiunti continuamente all'inizio.
Tuttavia, la spiegazione non è ancora chiara. Dopo aver visto altre implementazioni di useState,
ho scoperto che non chiamano tutte mountState, ma chiamano updateState e rerenderState durante il re-rendering.
Pertanto, la struttura è quella sopra descritta e si dice che diverse funzioni vengano chiamate in base all'evento.
Se vuoi vedere il codice direttamente, puoi fare riferimento a react/packages/react-reconciler/src/ReactFiberHooks.js.
Commenti0