Logo Hpv 4 Learning
Academy
Web Agency
react

React e async await: Interagire con un API

By Hpv4Learning 2 min25/04/2021
"In React quando usiamo lo useEffect non possiamo definire la callback function come asyncrona."
Gelateria

Troverai nel progetto

Che cosa realizzeremo in questo progetto ?

Fetcheremo dei dati da un'API, con cui creeremo il menù di un Gelateria che prevederà 4 categorie: all, cono, coppette e stick. Il nostro utente atterrerà con la voce 'all' preselezionata e grazie a una navigazione in tab potrà passare da una categoria all'altra.

Di che cosa avremmo bisogno ?

  • useState: Ci serviranno più state per tenere traccia del loading, eventuali errori, i prodotti, le categorie, la categoria selezionata e i prodotti filtrati in base alla categoria attiva.
  const [isLoading, setIsLoading] = useState(true);
  const [isError, setIsError] = useState(false);
  const [prodotti, setProdotti] = React.useState();
  const [categorie, setCategorie] = useState([]);
  const [filterProducts, setFilterProducts] = useState();
  const [selceted, setSelected] = useState(0);

Usare useEffect per fetchare dati da un API

Iniziamo fetchando i dati da un API. In questo esempio useremo una IIFE, ovvero una funzione invocata immediatemente dopo la definizione. Questo perché in React quando usiamo lo useEffect non possiamo definire la callback function come asyncrona.

//Ritornerà un errore
React.useEffect(async () => ... , [])

Per risolvere questo problema abbiamo due opzioni:

  • Definire una funzione asyncrona all'esterno dello useEffect e richiamarla al suo interno
  • Definire una funzione ayncrona nel corpo dello useEffect ed invocarla. Noi sceglieremo quest'ultima
 React.useEffect(() => {
    //IIFE
    (async () => {
      setIsLoading(true);
      setIsError(false);
      try {
        const response = await axios.get(url);
        setProdotti(response.data.data);
        setFilterProducts(response.data.data);

        //Ottengo Array di elementi non ripetibili
        const nuoveCategorie = Array.from(
          new Set(response.data.data.map((el) => el.categoria))
        );

        //Aggiungo all'inizio termine all
        nuoveCategorie.unshift("all");
        setCategorie(nuoveCategorie);

        //Termino Caricamento
        setIsLoading(false);
      } catch (error) {
        //Errore
        setIsError(true);
        setIsLoading(false);
        console.log(error);
      }
    })();
  }, []);

Filtrare un Array in React

Ora dobbiamo gestire la navigazione dell'utente tramite il menu e filtrare l'array di prodotti in base alla scelta del nostro utente. Per fare questo definiremo una funzione che ci permetta di updatare entrambi i nostri state di select e filteredProduct.

 const filtraProdotti = (categoria, index) => {
    setSelected(index);
    //Se indico "all" ripristino allo stato iniziale
    if (categoria === "all") {
      setFilterProducts(prodotti);
    } //Se no uso filter Method
    else {
      const prodottiFiltrati = prodotti.filter((el) =>
        el.categoria === categoria ? el : ""
      );
      setFilterProducts(prodottiFiltrati);
    }
  };

Per selected andiamo ad utilizzare un numero in modo da poter controllare grazie alla posizione che occupa all'intenro dell'array di categorie, quale sia la categoria attiva.

<div className="lista-categorie">
     {categorie.map((categoria, index) => (
         <button
         className={`btn btn-selector ${
           selceted === index && "active"
         }`}
         key={index}
         data-categoria={categoria}
         onClick={() => filtraProdotti(categoria, index)}
             >
            {categoria}
        </button>
     ))}
</div>

Prossimo Progetto

Form in React: Creare le sfumature di un colore

Form in React: Creare le sfumature di un colore

Un app per trovare le sfumature di chiare e scure di ogni colore

react

Informazioni aggiuntive

Livello: Principiante

225 lezioni

25 ore di videocorso

11 Progetti pratici

3052 studenti iscritti

Voto Medio:

4.5

Prezzo originale: 29.99€

Supporto Premium

text

Scopri il corso completo

React.js e Redux in Italiano: Te...


3052

4.5

Copertina
React.js e Redux in Italian...