
GUIDE PER ASPIRANTI PROGRAMMATORI
Quando usare gli effetti collaterali in React
Nella sezione in cui abbiamo parlato di useEffect, abbiamo visto alcuni ottimi esempi di utilizzo corretto degli effetti collaterali. Nella nostra applicazione di esempio, possiamo usare useEffect all’interno di useQuery e useQueryState, per sottolineare l’effetto collaterale che esiste già: // File: src/hooks/useQuery.js import { useEffect } from "react"; import { useCommand } from "./useCommand";…


Vuoi avviare una nuova carriera o fare un upgrade?
Trova il corso Digital & Tech più adatto a te nel nostro catalogo!
Nella sezione in cui abbiamo parlato di useEffect, abbiamo visto alcuni ottimi esempi di utilizzo corretto degli effetti collaterali. Nella nostra applicazione di esempio, possiamo usare useEffect all’interno di useQuery e useQueryState, per sottolineare l’effetto collaterale che esiste già:
// File: src/hooks/useQuery.js import { useEffect } from "react"; import { useCommand } from "./useCommand"; export function useQuery({ path, initialData }) { const [networkRequest, sendNetworkRequest] = useCommand({ path, method: "GET", }); useEffect(() => { if (networkRequest.isIdle()) { sendNetworkRequest(initialData); } }, [networkRequest, sendNetworkRequest, initialData]); return [networkRequest, sendNetworkRequest]; } // File: src/hooks/useQueryState.js import { useEffect, useState } from "react"; import { NetworkRequest } from "./NetworkRequest"; import { sendNetworkRequest } from "../mock/sendNetworkRequest"; export function useQueryState({ path, initialData }) { const [queryState, setQueryState] = useState(NetworkRequest.create()); // FIXME: // eslint-disable-next-line react-hooks/exhaustive-deps const sendQuery = (data) => { setQueryState((state) => { return state.load(); }); sendNetworkRequest({ path, method: "GET", data }).then( (response) => { setQueryState((state) => { return state.succeed(response); }); }, (error) => { setQueryState((state) => { return state.fail(error); }); } ); }; const setNetworkState = (setStateAction) => { setQueryState((state) => { return state.map((data) => { if (typeof setStateAction === "function") { return setStateAction(data); } else { return setStateAction; } }); }); }; useEffect(() => { if (queryState.isIdle()) { sendQuery(initialData); } }, [queryState, sendQuery, initialData]); return [queryState, sendQuery, setNetworkState]; } Notiamo come, in useQueryState, abbiamo aggiunto un commento: // FIXME: // eslint-disable-next-line react-hooks/exhaustive-deps
Questo commento spegne un avvertimento di React che ha a che fare con le dipendenze dell’effetto, che è proprio quello che non bisognerebbe fare! Ed ecco perché abbiamo usato “FIXME:” per tracciare il problema, con la nostra estensione di VS Code (se l’hai installata).
Approfondimenti
La guida ufficiale di React ha una serie di capitoli interi legati agli effetti, perché, come abbiamo detto, sono il concetto più mal interpretato e impropriamente usato di React. Per approfondire ulteriormente con altri esempi, puoi, appunto, fare riferimento alla guida ufficiale:
- You Might Not Need an Effect: parla di ciò di cui abbiamo appena parlato, con alcuni esempi molto simili e qualche esempio in più.
- Separating Events from Effects: si concentra sulla differenza tra effetti collaterali e funzioni per gestire gli eventi.
- Removing Effect Dependencies: esplora modi per ottenere effetti con meno dipendenze, per evitare di spegnere gli avvertimenti di React.
CONTENUTI GRATUITI IN EVIDENZA
Guide per aspiranti programmatori 👨🏻🚀
Vuoi muovere i primi passi nel Digital e Tech? Abbiamo preparato alcune guide per aiutarti a orientarti negli ambiti più richiesti oggi.