Dopo un po' che scrivi React ti accorgi che certe logiche le riscrivi sempre uguali. Ho iniziato a tenerle in un file hooks/ e a portarlo da un progetto all'altro. Ne ho accumulati diversi nel tempo, ma quelli che finiscono in quasi ogni app sono sempre gli stessi tre o quattro.
useLocalStorage è quello che uso di più. Funziona come useState ma persiste il valore nel localStorage. Utile per preferenze utente, tema, filtri attivi — qualsiasi cosa che non vuoi perdere al refresh. La versione che uso gestisce anche il caso in cui il valore salvato non sia più compatibile con il tipo attuale.
useDebounce lo metto ogni volta che ho un input collegato a una ricerca o a una chiamata API. Prende un valore e un delay, e restituisce la versione 'ritardata' che aggiorno solo dopo che l'utente ha smesso di scrivere. Senza di lui ogni keystroke farebbe partire una fetch.
useClickOutside serve quasi sempre quando costruisco dropdown o modal fatti a mano. Attacca un listener al documento e chiama una callback quando il click avviene fuori dall'elemento passato come ref. Tre righe di useEffect, ma le dimentico sempre — meglio averlo pronto.