Menu

Hook di React: tutti gli hook spiegati con esempi dal vivo

Un hook è una funzione il cui nome inizia con use e che permette a un componente di usare una funzionalità di React come lo stato, il context, i ref o gli effetti. Scopri tutti gli hook integrati raggruppati per scopo, le due regole che ogni hook segue e come scriverne uno tuo.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Gli hook di React sono funzioni il cui nome inizia con use che permettono a un function component di usare le funzionalità di React: useState per ricordare un valore, useEffect per eseguire codice dopo il rendering, useRef per tenere un nodo DOM, useContext per leggere dati condivisi. Li chiami in cima al tuo componente, e React conserva i loro valori tra un rendering e l'altro.

Qui lavorano insieme quattro hook. useState memorizza il testo, useRef punta all'input così il pulsante può dargli il focus, useMemo conserva la lista filtrata finché la query non cambia, e useEffect registra un log dopo ogni rendering in cui la query è cambiata. Scrivi an e guarda la Console: una riga per ogni tasto, dopo che la lista si è aggiornata.

Perché esistono gli hook

Prima di React 16.8, un componente che aveva bisogno di stato o di codice del ciclo di vita doveva essere una classe. La logica di una funzionalità era divisa tra componentDidMount, componentDidUpdate e componentWillUnmount, e condividerla tra componenti significava usare mixin (che non hanno mai funzionato con la sintassi delle classi), higher order component o render prop, che racchiudevano tutti il tuo albero in livelli aggiuntivi.

// The class way: one feature, three methods
class Clock extends React.Component {
    state = { now: new Date() };
    componentDidMount() {
        this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
    }
    componentWillUnmount() {
        clearInterval(this.id);
    }
    render() {
        return <p>{this.state.now.toLocaleTimeString()}</p>;
    }
}

Con gli hook la stessa funzionalità vive in un solo punto: l'effetto avvia il timer e la sua funzione di cleanup lo ferma.

Nascondi l'orologio e la Console stampa timer stopped: React ha eseguito la funzione di cleanup quando Clock ha lasciato lo schermo. Mostralo di nuovo e parte un timer nuovo. I class component funzionano ancora in React 19, ma il codice nuovo usa gli hook.

Tutti gli hook integrati

React 19.2 raggruppa i suoi hook in base a ciò che danno a un componente. Userai i primi due gruppi ogni giorno e gli altri quando un problema specifico li richiede.

HookCosa ti dàPagina
useStateUn valore che sopravvive ai rendering e un setter che provoca un nuovo renderuseState
useReducerStato aggiornato da una funzione reducer e da azioni inviate con dispatchuseReducer
useContextUn valore fornito da un genitore, senza passare propsuseContext
useRefUna scatola modificabile che sopravvive ai rendering, spesso un nodo DOMuseRef
useImperativeHandleSceglie cosa vede un genitore attraverso il tuo refforwardRef
useEffectCodice eseguito di solito dopo il disegno: timer, sottoscrizioni, recupero dei datiuseEffect
useLayoutEffectCodice eseguito dopo l'aggiornamento del DOM ma prima del disegnouseLayoutEffect
useInsertionEffectEseguito prima dei layout effect, per le librerie CSS in JS
useEffectEventUna funzione che un effetto può chiamare e che vede sempre le props e lo stato più recentiuseEffect
useMemoMette in cache un valore calcolato tra un rendering e l'altrouseMemo
useCallbackMette in cache una funzione tra un rendering e l'altrouseCallback
useTransitionSegna un aggiornamento come non urgente e ti dice quando è in attesauseTransition
useDeferredValueUna copia di un valore che resta indietro durante i rendering pesantiuseDeferredValue
useIdUn id univoco che coincide sul server e sul clientuseId
useSyncExternalStoreSi iscrive a uno store che vive al di fuori di ReactuseSyncExternalStore
useDebugValueUn'etichetta per un hook personalizzato in React DevTools
useLegge una promise o un context, e può stare dentro una condizioneuse
useActionStateStato aggiornato da una form action, con un indicatore di attesauseActionState
useOptimisticMostra il risultato atteso prima che il server rispondauseOptimistic
useFormStatusLo stato di attesa del form genitore (da react-dom)

use, useActionState, useOptimistic e useFormStatus sono arrivati con React 19, e useEffectEvent è diventato stabile nella 19.2. Tutti gli altri hook della lista funzionano anche in React 18.

Lo stato provoca rendering, i ref no

Non tutti gli hook provocano un rendering. useState e useReducer sì: cambi il loro valore e React ridisegna il componente. useRef ti consegna un oggetto il cui campo current puoi cambiare liberamente, e React non esegue mai un nuovo render per questo. Ciò lo rende il posto giusto per l'id di un timer, un valore precedente o un conteggio che lo schermo non mostra.

useReducer contiene il carrello e useState contiene la nota; entrambi provocano un rendering quando cambiano, e l'effetto registra una riga per ogni rendering. L'effetto cambia anche commits.current, eppure quella modifica non provoca mai un rendering di per sé, quindi il log non entra in un ciclo. Il conteggio viene aggiornato in un effetto invece che nel corpo del componente perché il corpo non dovrebbe cambiare nulla mentre esegue il rendering.

Le regole degli hook

Ogni hook segue due regole:

  1. Chiama gli hook al livello più alto del tuo componente, mai dentro una condizione, un ciclo o una funzione annidata.
  2. Chiama gli hook solo dai function component o dai tuoi hook personalizzati.

React non riconosce gli hook per nome. Li riconosce dall'ordine in cui li chiami, e si aspetta che quell'ordine sia lo stesso a ogni rendering. Un hook dentro un if sposterebbe tutti gli hook successivi. La pagina sulle regole degli hook mostra cosa si rompe e come sistemarlo. use è l'unica eccezione: può essere chiamato dentro una condizione.

Il tuo primo hook personalizzato

Quando due componenti hanno bisogno della stessa logica con stato, spostala in una funzione il cui nome inizia con use. Quella funzione può chiamare qualsiasi altro hook. Ogni componente che la chiama riceve il proprio stato.

Entrambi i contatori eseguono lo stesso hook, ma cliccarne uno lascia stare l'altro: un hook personalizzato condivide la logica, non lo stato. Aggiungi una funzione decrement a useCounter e un pulsante che la chiama, ed entrambi i contatori la ottengono insieme. Altri schemi (useToggle, useDebounce, useLocalStorage) sono nella pagina sugli hook personalizzati.

Quale hook scegliere

  • Lo schermo deve cambiare quando un valore cambia: useState, oppure useReducer quando molti eventi aggiornano lo stesso stato.
  • Devi comunicare con qualcosa al di fuori di React (un timer, una sottoscrizione, una richiesta): useEffect.
  • Ti serve un nodo DOM o un valore che lo schermo non mostra: useRef.
  • Molti componenti in profondità nell'albero hanno bisogno dello stesso valore: useContext.
  • Un rendering è lento a causa di un calcolo o perché un figlio memorizzato esegue un nuovo render: useMemo e useCallback. React Compiler può aggiungere questa memoizzazione per te, ma scriverla a mano funziona ancora ed è ancora comune.
  • La digitazione sembra rallentata perché l'aggiornamento che la segue è pesante: useTransition o useDeferredValue.

Domande frequenti

Cosa sono gli hook in React?

Gli hook sono funzioni il cui nome inizia con use che permettono a un function component di usare le funzionalità di React: useState per lo stato, useEffect per gli effetti collaterali, useContext per il context, useRef per valori che sopravvivono ai rendering senza provocarne uno, e altri.

Perché sono stati aggiunti gli hook a React?

Prima degli hook (React 16.8), lo stato e i metodi del ciclo di vita esistevano solo nei class component, e condividere logica con stato richiedeva mixin, higher order component o render prop. Gli hook mettono quella logica in semplici funzioni che puoi chiamare da qualsiasi function component e condividere come hook personalizzati.

Quanti hook ha React?

React 19.2 include una ventina di hook integrati nel pacchetto react, più useFormStatus in react-dom. La maggior parte delle app ne usa ogni giorno una manciata: useState, useEffect, useRef, useContext, useMemo e useCallback.

Posso usare gli hook nei class component?

No. Gli hook funzionano solo dentro i function component e altri hook. Puoi comunque renderizzare un class component accanto ai function component, e una classe può renderizzare un function component che usa gli hook.

Cos'è un hook personalizzato?

Una tua funzione il cui nome inizia con use e che chiama altri hook. Permette a più componenti di riutilizzare la stessa logica con stato, mentre ogni componente che la chiama riceve comunque il proprio stato separato.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA