Quando usare gli effetti collaterali in React | Aulab

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";…

Lezione 33 / 41
Enza Neri
Immagine di copertina

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:

Sei indeciso sul percorso? 💭

Parliamone! Scrivici su Whatsapp e risponderemo a tutte le tue domande per capire quale dei nostri corsi è il più adatto alle tue esigenze.

Oppure chiamaci al 800 128 626