useEffect hook
Esegui side effect dopo il render e sincronizza il componente con sistemi esterni.
Quando usarlo
useEffect serve per sincronizzare un componente con qualcosa che vive fuori dal render: document.title, event listener, timer, storage, librerie esterne o API browser.
function PageTitle({ title }) {
useEffect(() => {
document.title = title;
}, [title]);
return html`<h1>${title}</h1>`;
}L'effect viene eseguito dopo il render. Se passi un array di dipendenze, Wompo lo riesegue solo quando cambia uno di quei valori.
Dipendenze
function UserPreview({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetch(`/api/users/${userId}`)
.then((response) => response.json())
.then(setUser);
}, [userId]);
if (!user) return html`<p>Caricamento...</p>`;
return html`<strong>${user.name}</strong>`;
}Se userId cambia, l'effect parte di nuovo. Se non cambia, il componente può renderizzare altre volte senza ripetere la fetch.
Cleanup
Ritorna una funzione per rimuovere listener, timer o risorse aperte.
function WindowSize() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const onResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, []);
return html`<span>${width}px</span>`;
}Senza cleanup, il listener resterebbe attivo anche dopo la rimozione del componente.
Timer
Quando usi timer, conserva l'id e cancellalo nel cleanup.
function Clock() {
const [now, setNow] = useState(() => new Date());
useEffect(() => {
const id = setInterval(() => setNow(new Date()), 1000);
return () => clearInterval(id);
}, []);
return html`<time>${now.toLocaleTimeString()}</time>`;
}Integrazioni esterne
Per librerie che modificano direttamente il DOM, usa useRef per puntare al nodo e inizializza tutto in un effect.
function ChartBox({ data }) {
const root = useRef();
useEffect(() => {
const chart = createChart(root.current, data);
return () => chart.destroy();
}, [data]);
return html`<div ref=${root}></div>`;
}Errori comuni
- Non usare
useEffectper calcoli derivabili durante il render: calcola direttamente o usauseMemo. - Non lasciare array di dipendenze incompleti.
- Non leggere
windowdurante SSR fuori da un effect o da un'isola client-side. - Non dimenticare il cleanup per listener, interval, observer e subscription.
useContext - Hooks Wompo
Usa useContext per condividere stato in una porzione dell'app.
useExposed - Hooks Wompo
Usa useExposed per pubblicare metodi controllati sul custom element.