<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ React - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ React - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 13:41:48 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/react/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Buone Pratiche di React – Suggerimenti per Scrivere del Codice React Migliore nel 2022 ]]>
                </title>
                <description>
                    <![CDATA[ Due anni fa, ho iniziato a imparare e a usare React, e oggi continuo a usarlo per il mio lavoro di sviluppatore software e per progetti personali. In questo tempo ho incontrato un sacco ti problemi "tipici". Così ho cercato in giro e ho trovato alcune buone pratiche che ho ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/buone-pratiche-di-react-suggerimenti-per-scrivere-del-codice-react-migliore-nel-2022/</link>
                <guid isPermaLink="false">62fe028b03346c07472e9d49</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Wed, 22 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/React-Best-Practices-Thumbnail.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/best-practices-for-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Best Practices – Tips for Writing Better React Code</a>
      </p><p>Due anni fa, ho iniziato a imparare e a usare React, e oggi continuo a usarlo per il mio lavoro di sviluppatore software e per progetti personali.</p><p>In questo tempo ho incontrato un sacco ti problemi "tipici". Così ho cercato in giro e ho trovato alcune buone pratiche che ho integrato nel mio flusso di lavoro e che hanno reso più semplice la mia vita e quella dei miei colleghi.</p><p>Durante questo percorso ho anche affrontato sfide che all'inizio non ho risolto al meglio e a cui voglio approcciarmi in un modo migliore in futuro.</p><p>Questa è la ragione per cui ho scritto questa guida. A cui penso come a una raccolta di suggerimenti che avrei voluto dare a me stesso due anni fa, quando ho iniziato.</p><h2 id="indice-"><strong>Indice:</strong></h2><ul><li><a href="#le-tre-sfide-che-ogni-sviluppatore-react-affronta">Le tre sfide che ogni sviluppatore React affronta</a></li><li><a href="#imparare-gli-elementi-fondamentali-di-react">Imparare gli elementi fondamentali di React</a></li><li><a href="#come-realizzare-dei-componenti-react-puliti-prestanti-e-manutenibili">Come realizzare dei componenti React puliti, prestanti e manutenibili</a></li><li><a href="#suggerimenti-per-scrivere-del-codice-react-migliore-la-ciliegina-sulla-torta">Suggerimenti per scrivere del codice React migliore – La ciliegina sulla torta</a></li><li><a href="#conclusione">Conclusione</a></li></ul><p>Innanzitutto, conoscerai le <strong>tre sfide principali </strong>che ogni sviluppatore React deve affrontare. Questo è importante perché quando sei cosciente delle potenziali sfide, capirai le ragioni alla base di queste buone pratiche in modo più profondo. Avere questa mentalità dall'inizio può essere d'aiuto anche quando stai progettando dei componenti o organizzando un progetto.</p><p>Dopo questo primo importante passo, ti parlerò di <strong>tre buone pratiche</strong>. Sono un mix di suggerimenti teorici e pratici con esempi di codice. Proverò a minimizzare i problemi in stile <em>hello world</em> e arrivare a ciò che ho visto nel <em>mondo reale</em>.</p><h2 id="le-tre-sfide-che-ogni-sviluppatore-react-affronta"><strong>Le tre sfide che ogni sviluppatore React affronta</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/christian-erfurt-sxQz2VfoFBE-unsplash.jpg" class="kg-image" alt="christian-erfurt-sxQz2VfoFBE-unsplash" width="600" height="400" loading="lazy"></figure><p>Durante i miei due anni di uso quotidiano di React, ho individuato tre sfide principali che uno sviluppatore React deve affrontare per realizzare le proprie app. Ignorare queste difficoltà potrebbe portare a momenti difficili che nuocciono alla crescita dell'app.</p><p>Quindi, tieni a mente questi problemi quando orchestri la tua app, perché ti risparmieranno tempo ed energie.</p><h3 id="-manutenibilit-"><strong>⚙️ Manutenibilità</strong></h3><p>Questo va a braccetto con la <em>riusabilità</em>. All'inizio, quando l'applicazione e i componenti sono molto leggeri, è semplice fare manutenzione. Ma una volta che le esigenze iniziano a crescere, i componenti tendono a diventare molto complessi e perciò più difficili da gestire.</p><p>Spesso ho visto un componente con molti casi diversi, ognuno che rappresenta un risultato diverso. Il JSX è inondato da rendering condizionale (operatori ternari e semplici operatori <code>&amp;&amp;</code>), classname applicati in modo condizionale o componenti che usano un'istruzione <code>switch</code> enorme. Ci sono molti possibili valori di prop e stati, ognuno responsabile di un risultato diverso.</p><p>Secondo me, non c'è niente di sbagliato in queste tecniche in quanto tali. Ma credo che tutti dovrebbero pensare a cosa fare quando un componente inizia a diventare poco manutenibile e quando queste tecniche vengono usate eccessivamente. Impareremo come controllare questo aspetto più avanti in questo articolo.</p><p>Il problema (e ne sono colpevole anch'io) è che maggiori sono la complessità e i diversi risultati di un componente (polimorfismo), più questo risulta difficile da gestire.</p><p>A essere onesto, la causa principale è spesso la pigrizia, esperienza insufficiente o mancanza di tempo per fare il refactoring di un componente in modo adeguato, così da renderlo più gestibile e pulito.</p><p>Un altro fattore chiave che ho visto è l'insufficienza o la mancanza di test. Lo so, non è un tipo di lavoro che molti sviluppatori amano, ma può davvero essere d'aiuto sul lungo termine. </p><h3 id="-solida-conoscenza-di-react"><strong>🧠 Solida conoscenza di React</strong></h3><p>Un'altra causa principale dei problemi degli sviluppatori React è una scarsa comprensione del funzionamento di base di React. Ci sono passato anch'io.</p><p>Ho visto molte persone saltare troppo velocemente in concetti intermedi o avanzati senza avere basi solide. Ma questo non è specifico di React, bensì è un problema generale nella programmazione.</p><p>Non avere delle conoscenze solide di React può anche causare problemi a te come sviluppatore. Ricordo i mal di testa avuti quando volevo usare diversi cicli di vita di componenti senza sapere effettivamente come farlo. Quindi ho dovuto fare qualche passo indietro e poi approfondire l'argomento.</p><p>Dato che ritengo che sia uno degli aspetti più importanti, gli ho dedicato un intero capitolo all'interno di questo articolo.</p><h3 id="-scalabilit-"><strong>📈 Scalabilità</strong></h3><p>Questa sfida va a braccetto con la <em>manutenibilità</em>. Non è specifica per React, ma si applica in genere ai software.</p><p>Ho imparato che per realizzare dei software eccellenti non contano solo esperienza utente, schemi di codice puliti o un'architettura ingegnosa. Per me, la qualità di un software aumenta o diminuisce in base alla possibilità di essere scalato.</p><p>Molte cose entrano in gioco nell'aumentare la scalabilità di un software. In questo articolo troverai dei suggerimenti utili a questo riguardo.</p><p>Credo che tenendo a mente la <em>manutenibilità </em>e la <em>scalabilità </em>quando orchestri i tuoi componenti e organizzi la struttura del progetto, sia meno probabile che tu finisca per avere un codice sorgente incasinato che ha bisogno di un refactoring.</p><h1 id="come-imparare-react"><strong>Come imparare React</strong></h1><p>Bene, adesso affrontiamo approfonditamente delle buone pratiche per imparare a usare React.</p><h2 id="imparare-gli-elementi-fondamentali-di-react"><strong>Imparare gli elementi fondamentali di React</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/brett-jordan-Lzfxzip-pNI-unsplash.jpg" class="kg-image" alt="brett-jordan-Lzfxzip-pNI-unsplash" width="600" height="400" loading="lazy"></figure><p>Come abbiamo già discusso brevemente, conoscere gli elementi fondamentali non è importante soltanto per React, ma anche per qualsiasi altra tecnologia o linguaggio di programmazione. Non puoi costruire un grattacielo su delle fondazioni di sabbia e aspettarti che sia stabile.</p><p>Potrebbe sembrare ovvio per molti di voi, ma ho visto sviluppatori saltare direttamente a concetti di React intermedi o avanzati senza comprenderne davvero le basi.</p><p>Questo è vero anche per JavaScript in generale. Credo fortemente che imparare React non ha senso se non hai delle solide basi di JavaScript vanilla (JS senza framework o librerie aggiuntive).</p><p>Se ti sembra qualcosa di familiare e stai pensando di imparare a usare React ma non ti senti ancora a tuo agio con JavaScript, dedica prima del tempo a rafforzare le tue conoscenze di JavaScript. In futuro, ti risparmierà un sacco di mal di testa e di tempo.</p><p>Ecco una guida utile per <a href="https://www.freecodecamp.org/italian/news/i-principali-concetti-javascript-da-conoscere-prima-di-imparare-react/">i concetti di JavaScript più importanti che devi conoscere prima di passare a React</a>.</p><p>Ma, secondo me, conoscere soltanto le basi non è sufficiente. È in qualche modo obbligatorio conoscere il funzionamento di React dietro le quinte. Se vuoi diventare un bravo sviluppatore React (e immagino sia così, visto che stai leggendo questo articolo), devi conoscere gli strumenti che stai utilizzando. È un bene per te in quanto sviluppatore e per i tuoi clienti.</p><p>Da un lato può salvarti da un sacco di tempo dedicato al debugging della tua app. Inoltre ti rende più efficiente perché non devi fare dei passi indietro e imparare di nuovo le basi, ancora e ancora. In pratica, sai quello di cui stai parlando.</p><p>Naturalmente, non puoi sapere tutto e non dovresti stressarti per questo. Imparerai sempre di più quando ti troverai ad affrontare problemi pratici e costruire altri progetti, ma con delle conoscenze solide parti ben equipaggiato.</p><p>Direi che ha senso, ma potresti chiederti cosa hai bisogno di sapere esattamente per avere delle basi solide di React.</p><p>Lo stretto indispensabile è costituito da tutti gli argomenti presenti nei <a href="https://it.reactjs.org/docs/hello-world.html"><strong>Concetti Chiave</strong></a> della documentazione sul sito ufficiale di React.</p><p>Un altro argomento con cui dovresti avere familiarità è quello sugli <a href="https://it.reactjs.org/docs/hooks-intro.html">Hooks</a> perché sono diventati una convenzione e sono usati ovunque, specialmente in pacchetti React di terze parti.</p><p>Di certo potresti usare più di frequente <code>useState</code> e <code>useEffect</code>, ma è essenziale anche conoscerne altri come <code>useMemo</code>, <code>useCallback</code> o <code>useRef</code>.</p><p>C'è anche un altro capitolo chiamato <a href="https://it.reactjs.org/docs/accessibility.html">Guide Avanzate</a> che non considererei obbligatorio all'inizio, ma di cui raccomanderei vivamente di apprendere i concetti durante il tuo viaggio in React.</p><p>Come sempre, è spesso più semplice comprendere argomenti avanzati quando possiedi già un po' di esperienza pratica. Ma più cose apprendi da subito, meglio è.</p><p>Naturalmente non devi limitarti a seguire soltanto la documentazione di React. Anche seguire corsi online che trattano gli elementi essenziali, guardare tutorial o leggere blog fa parte della costruzione di solide basi. Prova quello che funziona meglio per te.</p><p>Se dovessi indicare quali sono i concetti più importanti da conoscere indispensabilmente, sceglierei questi:</p><ul><li>cos'è uno "stato"?</li><li>up e down di classe e componenti funzionali</li><li>cosa i ri-rendering dei componenti e come funzionano?</li><li>come attivare i ri-rendering</li><li>differenti cicli di vita dei componenti e come interagire con essi</li><li>DOM virtuale</li><li>Benefici di CSR (Client Side Rendering) e SSR (Server Side Rendering) in generale e in React</li><li>Componenti controllati vs non controllati</li><li>Spostamento di stato</li><li>almeno una tecnologia di gestione dello stato globale (Context API, Redux/Toolkit, Recoil)</li><li>Pattern di componenti (soprattutto come scegliere il giusto pattern)</li></ul><h2 id="come-realizzare-dei-componenti-react-puliti-prestanti-e-manutenibili"><strong>Come realizzare dei componenti React puliti, prestanti e manutenibili</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/wesley-tingey-mvLyHPRGLCs-unsplash.jpg" class="kg-image" alt="wesley-tingey-mvLyHPRGLCs-unsplash" width="600" height="400" loading="lazy"></figure><p>Lo so – questo è il sogno di ogni programmatore (o almeno spero sia così). E per me, questa abilità distingue un buon programmatore da un ottimo programmatore. La parte divertente è che non è mai tutto completo perché c'è sempre qualcosa di nuovo da imparare e migliorare.</p><p>Seguire le buone pratiche non renderà le cose più semplici solo a te, ma anche ai tuoi colleghi. Ho visto team di sviluppo che hanno creato una <em>guida di stile</em> in cui hanno definito dei capisaldi su come scrivere il codice. Un'idea che apprezzo molto.</p><p>Alcuni di essi sono:</p><ul><li>usare componenti funzionali (come le funzioni freccia)</li><li>non usare stili inline</li><li>mantenere una struttura di importazione appropriata (prima import di terze parti --&gt; poi import interni)</li><li>formattare il codice prima di un commit</li></ul><p>E via dicendo.</p><p>Naturalmente è possibile essere molti dettagliati a questo riguardo. Questo dipende dal tuo team. Personalmente, non amo le guide estremamente dettagliate perché penso che uno sviluppatore esperto dovrebbe avere una certa libertà e non dovrebbe essere troppo vincolato.</p><p>In ogni caso, una guida di stile è un buon modo per definire e mantenere delle buone pratiche e assicurarsi che il team sia allineato per quanto riguarda le questioni importanti. Credo che questo favorisca incredibilmente il lavoro di squadra e i risultati.</p><p>Diamo un'occhiata alle buone pratiche che riguardano la creazione di componenti puliti, prestanti e manutenibili. Mettiti comodo, tieni a portata qualcosa per prendere appunti e buon divertimento!</p><h3 id="-creare-una-buona-struttura-di-cartelle"><strong>📁 Creare una buona struttura di cartelle</strong></h3><p>Organizzare i tuoi file e cartelle all'interno di un'app React è obbligatorio per la manutenibilità e la scalabilità.</p><p>Una buona struttura di cartella dipende dalla dimensione dell'applicazione e del team, quindi non esiste una soluzione generale per questo. Soprattutto perché si tratta di un argomento molto discusso e dipende anche dalle preferenze personali.</p><p>Col tempo, però, si sono sviluppate alcune buone pratiche per le varie dimensioni di un'applicazione.</p><p><a href="https://www.robinwieruch.de/react-folder-structure/">Questo ottimo post</a> (risorsa in inglese) passa in rassegna cinque diverse dimensioni di un'app e introduce buone idee su come organizzare file e cartelle. Avere queste cose in mente quando pianifichi o avvii la tua applicazione può fare una differenza enorme sul lungo termine.</p><p>Non sovra-ingegnerizzarla, ma fai del tuo meglio per mantenere una strutturata appropriata che si adatti alla dimensione dell'applicazione e del team.</p><h3 id="-mantenere-un-ordine-di-import-strutturato"><strong>👇 Mantenere un ordine di import strutturato</strong></h3><p>Se hai già un po' di esperienza con React, potresti aver visto file rigonfi di istruzioni import. Potrebbero anche essere mescolati a import esterni da pacchetti di terze parti e import interni come altri componenti, funzioni di utilità, stili e molto altro.</p><p>Un esempio reale (tagliato):</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">import React, { useState, useEffect, useCallback } from "react";
import Typography from "@material-ui/core/Typography";
import Divider from "@material-ui/core/Divider";
import Title from "../components/Title";
import Navigation from "../components/Navigation";
import DialogActions from "@material-ui/core/DialogActions"
import { getServiceURL } from '../../utils/getServiceURL";
import Grid from "@material-ui/core/Grid";
import Paragraph from "../components/Paragprah";
import { sectionTitleEnum } from "../../constants";
import { useSelector, useDispatch } from "react-redux";
import Box from "@material-ui/core/Box";
import axios from 'axios';
import { DatePicker } from "@material-ui/pickers";
import { Formik } from "formik";
import CustomButton from "../components/CustomButton";
...</code></pre><figcaption>In realtà gli import occupano 55 righe.</figcaption></figure><p>Probabilmente ti sei accorto del problema qui. È difficile distinguere quali sono gli import di terze parti e quelli locali (interni). Non sono raggruppati e sembrano essere ovunque.</p><p>Una versione migliore:</p><pre><code class="language-javascript">import React, { useState, useEffect, useCallback } from "react";
import { useSelector, useDispatch } from "react-redux";
import { Formik } from "formik";
import axios from 'axios';
import Typography from "@material-ui/core/Typography";
import Divider from "@material-ui/core/Divider";
import Box from "@material-ui/core/Box";
import DialogActions from "@material-ui/core/DialogActions";
import Grid from "@material-ui/core/Grid";
import { DatePicker } from "@material-ui/pickers";

import { getServiceURL } from '../../utils/getServiceURL";
import { sectionTitleEnum } from "../../constants";
import CustomButton from "../components/CustomButton";
import Title from "../components/Title";
import Navigation from "../components/Navigation";
import Paragraph from "../components/Paragraph";
...</code></pre><p>La struttura è più chiara ed è molto semplice distinguere dove si trovano gli import esterni e interni. Certamente è possibile ottimizzare questa disposizione se stai usando più import (nel caso sia possibile :) ). Questo ti permette di importare tutti i componenti derivanti da material-ui tutti in una sola riga.</p><p>Ho visto altri sviluppatori a cui piace dividere la struttura degli import in tre parti:</p><p>Integrati (come 'react') --&gt; Esterni (moduli di node di terze parti) --&gt; Interni.</p><p>Puoi gestire tutto da solo oppure lasciar fare il lavoro a un <strong>linter</strong>.</p><h3 id="-imparare-diversi-schemi-di-componenti"><strong>📔 Imparare diversi schemi di componenti</strong></h3><p>Per fare in modo di non finire con del codice ingestibile e non scalabile, è essenziale imparare diversi pattern di componenti man mano che acquisisci esperienza con React.</p><p>Ma non è tutto. Conoscere i diversi pattern è un buon punto di partenza, ma l'aspetto più importante è sapere <strong>quando </strong>usare ognuno di essi per uno specifico problema.</p><p>Ogni pattern ha il suo scopo. Ad esempio, il <strong><strong>compound component pattern</strong></strong> evita il <em>prop-drilling</em> non necessario di molti livelli di componenti. Quindi, la prossima volta che inizi a passare delle prop attraverso 5 livelli di componenti per raggiungere alla fine il componente interessato dalla prop, comincerai a dirigere i componenti diversamente.</p><p>Una breve nota sul prop-drilling, visto che ho avuto molte discussioni in passato. Ci sono molte opinioni sul fatto che sia una cosa positiva o no. A me piace provare a pensare a un modo/pattern diverso se inizio a passare prop attraverso più di due livelli di componenti.</p><p>Ciò ti rende più efficiente come sviluppatore e fa sì che i componenti che scrivi siano più manutenibili e scalabili. Avere questi pattern nel tuo arsenale ti distingue dagli altri sviluppatori React. Ti consiglio vivamente di fare le tue ricerche, ma <a href="https://www.udemy.com/course/the-complete-guide-to-advanced-react-patterns/">questo corso</a> su Udemy mi ha aiutato molto.</p><h3 id="-usa-un-linter-e-segui-le-sue-regole"><strong>🔒Usa un linter e segui le sue regole</strong></h3><p>Un linter non ti aiuta soltanto a mantenere un ordire di import delle dipendenze distinguibile, ti aiuta a scrivere un codice migliore in generale.</p><p>Quando utilizzi <em><em>create-react-app</em></em>, ESLint è già configurato, ma puoi anche impostarlo completamente da solo o estendere un set di regole preconfigurato.</p><p>In pratica, un linter osserva il codice JavaScript che stai scrivendo e ti fa notare gli errori di cui ti accorgeresti probabilmente eseguendo il codice. Ci ho messo un po' per apprezzare davvero l'utilità di un linter, ma oggi non posso immaginare di lavorare senza.</p><p>Avere un linter è una cosa, ma seguire le sue regole è un'altra. Naturalmente puoi disabilitarlo, sia per una specifica riga di codice che per un intero file. Potrebbero esserci casi in cui ha senso farlo, ma per esperienza sono piuttosto rari.</p><p>Un altro grande vantaggio è che puoi anche regolare il controllo dello stile. È particolarmente utile per il lavoro in gruppo. Una volta che si è d'accordo su certe convenzioni su come scrivere e formattare il codice, è facile combinare ESLint con qualcosa simile a JSPrettify.</p><h3 id="-testare-il-codice"><strong>🧪 Testare il codice</strong></h3><p>Lo so, i test non sono la tua attività da sviluppatore preferita. Per me era così. All'inizio sembra un compito non necessario e fastidioso, e sul breve termine può essere vero. Ma sul lungo periodo – e quando un'applicazione cresce – è vitale.</p><p>Per me, i test sono diventati una pratica che mi assicura che sto facendo il mio lavoro in modo più professionale, creando software di migliore qualità.</p><p>In pratica, non c'è nulla di sbagliato con i test manuali effettuati da una persona, che non dovrebbero essere evitati completamente. Ma immagina di star integrando una nuova funzionalità e di voler essere sicuro che tutto funzioni a dovere. È un'attività che richiede tempo e favorisce l'errore umano.</p><p>Mentre stai scrivendo i test ti trovi già nel processo mentale di organizzare il codice in modo che passi i test. Per me è molto utile perché mi aiuta a capire quali insidie possono sorgere e a tenere un occhio su di esse.</p><p>Non ti tuffi direttamente a scrivere il tuo codice (cosa che non raccomando mai), ma pensi prima all'obiettivo.</p><p>Ad esempio, "Cosa dovrebbe fare uno specifico componente? Quali sono i casi limite rilevanti che devo testare? Posso rendere il componente più semplice in modo che abbia un solo scopo? ..."</p><p>Avere una visione del codice che stai per scrivere ti aiuta anche a mantenere alta l'attenzione per soddisfarla.</p><p>I test possono anche fungere da documentazione, perché per un nuovo sviluppatore non avvezzo al codebase può essere molto d'aiuto a capire le diverse parti del software e come ci si aspetta che funzionino.</p><p>Quindi non evitare i test perché sembrano un <em>lavoro extra</em>. La verità è che puoi risparmiare del tempo in futuro se li imposti appropriatamente.</p><p>Dai un'occhiata al <a href="https://it.reactjs.org/docs/testing.html">capitolo sui test della documentazione di React</a>, segui qualche tutorial sui test in React e inizia a scrivere una piccola applicazione TDD (test-driven development) o implementa dei test in una app su cui stai lavorando al momento.</p><h3 id="-integrare-typescript-o-usare-almeno-le-prop-di-default-e-prop-type-"><strong>🧰 Integrare Typescript (o usare almeno le prop di default e prop type)</strong></h3><p>Ricordo il mio primo progetto in React come sviluppatore software in cui il nostro gruppo ricevette un progetto in pratica già scritto da un'altra azienda. Abbiamo dovuto creare il progetto del client su di esso e Typescript era già integrato.</p><p>Fino a quel momento, io e i miei colleghi non avevamo molta esperienza con Typescript, dato che avevamo tutti un background in JavaScript vanilla.</p><p>Dopo poche settimane passate a lavorare sul progetto, abbiamo sentito che TypeScript non era un beneficio, ma un ostacolo che bloccava il nostro lavoro. Non stavamo proprio sfruttando i suoi vantaggi, perché avevamo definito tutto con tipo <em>any </em>per bloccare gli avvertimenti di Typescript.</p><p>Questo ci portò a decidere di rimuovere Typescript dal progetto e lavorare sul nostro terreno con JavaScript. All'inizio andò bene, ma man mano che il progetto diventava più complesso, iniziarono a venir fuori errori di tipo. Ciò ci fece dubitare della nostra decisione di sbarazzarci completamente di Typescript. Ma queste cose possono accadere e danno una preziosa esperienza per il futuro.</p><p>Queste circostanze mi hanno portato a dare a Typescript un'altra opportunità, così l'ho imparato nel mio tempo libero. Dopo avervi costruito alcuni progetti secondari, non potevo immaginare più la vita senza Typescript.</p><p>Usare Typescript ha molti lati positivi, come il controllo statico dei tipi, un migliore completamento del codice nel tuo IDE (intellisense), un'esperienza di sviluppo migliorata e l'individuazione di errori di tipo mentre scrivi il codice – tanto per nominarne alcuni.</p><p>D'altra parte, ci sono anche delle sfide, perché se non vieni da un background con linguaggi fortemente tipizzati (come Java o C#) potrebbe essere più difficile da afferrare all'inizio.</p><p>Ma posso dire che vale davvero la pena di impararlo e integrarlo. Ecco <a href="https://blog.bitsrc.io/5-strong-reasons-to-use-typescript-with-react-bc987da5d907">un bell'articolo</a> (risorsa in inglese) che può aiutarti ad avere una panoramica dei pro e dei contro dell'uso di Typescript in una applicazione React. E qui c'è <a href="https://www.freecodecamp.org/news/how-to-code-your-react-app-with-typescript/">un tutorial</a> (risorsa in inglese) su come programmare le tue app React in Typescript.</p><p>Ci potrebbero essere ragioni per cui non vuoi usare Typescript nella tua app React, va bene. Ma consiglio almeno di usare i prop-type e le default-prop per i tuoi componenti per essere sicuro di non fare confusione con le prop.</p><h3 id="-usare-lazy-loading-code-splitting"><strong>💎 Usare lazy-loading / code splitting</strong></h3><p>Se hai passato un po' di tempo nell'universo JavaScript e React, sei probabilmente incappato nell'<em>"impacchettamento" </em>(bundling). Per quelli che stanno sentendo questo termine per la prima volta, vediamo cosa dice la documentazione ufficiale di React:</p><blockquote>Molte applicazioni React hanno i loro file “impacchettati” usando strumenti come Webpack, Rollup oppure Browserify. Il processo di “impacchettamento” avviene prendendo tutti i file importati e unendoli tutti in un unico file, chiamato “bundle”. Questo file può essere poi incluso all’interno della pagina web per caricare l’intera applicazione tutta in una volta.</blockquote><p>In pratica, si tratta di un'ottima tecnica, ma con la crescita di una app si presenta una sfida. Il bundle inizia a crescere a sua volta. Soprattutto quando stai usando delle grandi librerie di terze parti come three.js.</p><p>L'insidia è che questo bundle ha bisogno di essere sempre caricato completamente, anche quando l'utente ha bisogno solo di una frazione del codice. Questo porta a problemi di prestazione perché può volerci un tempo eccessivamente lungo per caricare l'app.</p><p>Per evitarlo, esiste una tecnica chiamata <strong>code splitting</strong> in cui dividi i bundle nelle porzioni di codice di cui ha bisogno l'utente. Questa tecnica è supportata dalla maggior parte degli strumenti comuni come Webpack, Rollup, e Browserify. Il grande beneficio è che puoi creare più bundle e caricarli dinamicamente.</p><p>Dividere i bundle ti aiuta a caricare tramite <strong>lazy loading</strong> solo le cose necessarie all'utente.</p><p>Immagina di andare in un negozio di alimentari e di voler comprare solo delle banane, delle mele e del pane. In questo caso, non stai comprando tutta la merce a disposizione nel negozio, sei interessato solo a una porzione della merce a disposizione. Quindi? Compreresti tutto? Ci vorrebbe molto più tempo e sarebbe parecchio più costoso.</p><p>Credo sia importante essere consapevoli delle potenziali sfide che possono sorgere man mano che una app cresce e ci sono alcune tecniche a disposizione per liberarsene. Per approfondire, dai un'occhiata alla <a href="https://it.reactjs.org/docs/code-splitting.html">documentazione di React</a>.</p><h3 id="-estrarre-logica-riutilizzabile-in-hook-personalizzati"><strong>🗄️ Estrarre logica riutilizzabile in hook personalizzati</strong></h3><p>Secondo la documentazione di React:</p><blockquote><em>Gli hook ci consentono di riutilizzare la logica stateful senza dover cambiare la gerarchia dei componenti<em>.</em></em></blockquote><p>In pratica, si tratta di una soluzione migliore alle tecniche che erano usate precedentemente in combinazione con i componenti di classe. Se ti interessi di programmazione da un po', potresti ricordarti l'utilizzo di <strong>componenti di ordine superiore</strong> o <strong>render prop</strong>.</p><p>Ogni volta che ti trovi in una situazione in cui devi riutilizzare la stessa logica stateful già utilizzata in un altro componente funzionale, è un ottimo momento per creare un hook personalizzato. Al suo interno puoi incapsulare la logica e poi ti basterà chiamare l'hook come una funzione all'interno dei componenti.</p><p>Diamo un'occhiata a un esempio veloce in cui dobbiamo aggiornare la nostra interfaccia utente in base alla dimensione dello schermo e vogliamo tenere traccia della dimensione attuale della finestra ridimensionando manualmente la finestra del browser.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const ScreenDimensions = () =&gt; {
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });
  
  useEffect(() =&gt; {
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    window.addEventListener('resize', handleResize);
    handleResize();
    return () =&gt; window.removeEventListener('resize', handleResize);
  }, []);
  
  return (
  	&lt;&gt;
    	&lt;p&gt;Current screen width: {windowSize.width}&lt;/p&gt;
        &lt;p&gt;Current screen height: {windowSize.height}&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><figcaption>Grazie a: https://usehooks.com/useWindowSize/</figcaption></figure><p>Come puoi vedere, la soluzione è piuttosto diretta e non c'è nulla di sbagliato a definirlo così.</p><p>Adesso arriva la parte complessa. Immagina di voler usare la stessa logica in un altro componente, in cui renderizzare un'interfaccia utente diversa (una per smartphone e una per desktop) in base alla dimensione dello schermo.</p><p>Naturalmente, potremmo copiare la logica, incollarla, e il gioco è fatto. Ma questa non è una buona pratica, come potresti sapere dal principio DRY (Don't Repeat Yourself, ovvero "non ripeterti").</p><p>Se volessimo regolare la logica, dovremmo farlo in entrambi i componenti. E quando incolliamo la logica in ancora più componenti, diventa meno manutenibile e più favorevole agli errori.</p><p>Quindi, che faresti normalmente in un progetto JavaScript? Probabilmente definiresti una funzione che incapsula la logica e che può essere usata in molti posti diversi. È esattamente ciò che otteniamo con gli hook. Non sono nulla di più che funzioni JavaScript con alcune specialità di React perché stanno usando gli hook di React.</p><p>Vediamo come sarà il nostro hook personalizzato:</p><pre><code class="language-jsx">const useWindowSize = () =&gt; {
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });
  
  useEffect(() =&gt; {
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    window.addEventListener('resize', handleResize);
    handleResize();
    return () =&gt; window.removeEventListener('resize', handleResize);
  }, []);
  
  return windowSize;
}</code></pre><p>Adesso chiamiamolo semplicemente all'interno del componente <strong><strong>ScreenDimensions</strong></strong>:</p><pre><code class="language-jsx">const ScreenDimensions = () =&gt; {
  const windowSize = useWindowSize()
  
  return (
  	&lt;&gt;
    	&lt;p&gt;Current screen width: {windowSize.width}&lt;/p&gt;
        &lt;p&gt;Current screen height: {windowSize.height}&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><p>Ciò ci consente di chiamare semplicemente l'hook personalizzato in qualsiasi altro componente e salvare il valore di ritorno (che è la dimensione attuale della finestra) in una variabile che possiamo usare all'interno del componente.</p><pre><code class="language-jsx">const ResponsiveView = () =&gt; {
  const windowSize = useWindowSize()
  
  return (
  	&lt;&gt;
    	{windowSize.width &lt;= 960 ? (
          &lt;SmartphoneView /&gt;
        ) : (
          &lt;DesktopView /&gt;	
        )}
    &lt;/&gt;
  )
}</code></pre><h3 id="-gestire-efficacemente-gli-errori"><strong>🖥️ Gestire efficacemente gli errori</strong></h3><p>La gestione efficace degli errori è spesso trascurata e sottovalutata da molti sviluppatori. Come altre buone pratiche, sembra essere un aspetto secondario all'inizio. Vuoi far funzionare il codice e non vuoi "sprecare" tempo pensando agli errori.</p><p>Ma una volta che sei diventato più esperto e sei stato in situazioni spiacevoli in cui una gestione migliore degli errori ti avrebbe risparmiato molte energie (e del tempo prezioso, naturalmente), realizzi che sul lungo termine è obbligatorio avere una valida strategia di gestione degli errori nella tua applicazione. Soprattutto quando l'applicazione è distribuita in produzione.</p><p>Ma cosa significa esattamente <em>gestione degli errori </em>nel mondo di React? Ci sono diverse parti che hanno un ruolo. Una per <strong>individuare</strong> gli errori, un'altra per <strong>gestire </strong>l'interfaccia utente di conseguenza e l'ultima per <strong>registrarli </strong>appropriatamente.</p><h4 id="react-error-boundary"><strong>React Error Boundary</strong></h4><p>Questo è un componente di classe personalizzato usato come wrapper per l'intera applicazione. Naturalmente, puoi avvolgere il componente ErrorBoundary anche attorno a componenti più in profondità nell'albero dei componenti per renderizzare UI più specifiche, ad esempio. Fondamentalmente, è una buona pratica usare ErrorBoundary per incapsulare un componente che favorisce l'insorgenza di errori.</p><p>Con il metodo di ciclo di vita <code>componentDidCatch()</code> sei in grado di individuare errori durante la fase di rendering o in qualsiasi altro ciclo di vita dei componenti figli. Quindi, quando un errore si verifica in questa fase, arriva in superficie e viene colto dal componente ErrorBoundary.</p><p>Se stai usando un servizio di registrazione (che consiglio vivamente), è un ottimo posto da collegare.</p><p>La funzione statica <code>getDerivedStateFromError()</code> viene chiamata durante la fase di rendering e viene usata per aggiornare lo stato del componente ErrorBoundary. A seconda dello stato, puoi renderizzare condizionalmente un errore nell'interfaccia.</p><pre><code class="language-jsx">class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    //registra l'errore con un ERS
    errorService.log({ error, errorInfo });
  }

  render() {
    if (this.state.hasError) {
      return &lt;h1&gt;Oops, something went wrong.&lt;/h1&gt;;
    }
    return this.props.children; 
  }
}</code></pre><p>Il grande svantaggio di questo approccio è che non gestisce gli errori in callback asincroni, nel rendering lato server e nei gestori di eventi perché sono al di fuori dei confini.</p><h4 id="usare-try-catch-per-gestire-gli-errori-oltre-i-confini"><strong>Usare try-catch per gestire gli errori oltre i confini</strong></h4><p>Questa tecnica è efficace per individuare errori che possono verificarsi all'interno di callback asincroni. Immagina di star recuperando i dati del profilo di un utente da una API a di volerli visualizzare all'interno di un componente Profile.</p><pre><code class="language-jsx">const UserProfile = ({ userId }) =&gt; {
	const [isLoading, setIsLoading] = useState(true)
	const [profileData, setProfileData] = useState({})
    
    useEffect(() =&gt; {
    	// Separate function to make of use of async
        const getUserDataAsync = async () =&gt; {
        	try {
            	// Recupera i dati dalla API
            	const userData = await axios.get(`/users/${userId}`)
                // Restituisci un errore se il dato dell'utente è falsy (sarà intercettato da catch)
                if (!userData) {
                	throw new Error("No user data found")
                }
                // Se il dato dell'utente è truthy aggiorna lo stato
                setProfileData(userData.profile)
            } catch(error) {
            	// Registra ogni errore nel servizio di logging
            	errorService.log({ error })
                // Aggiorna stato 
                setProfileData(null)
            } finally {
            	// Resetta il carimento dello stato in ogni caso
                setIsLoading(false)
            }
        }
        
        getUserDataAsync()
    }, [])
    
    if (isLoading) {
    	return &lt;div&gt;Loading ...&lt;/div&gt;
    }
    
    if (!profileData) {
    	return &lt;ErrorUI /&gt;
    }
    
    return (
    	&lt;div&gt;
        	...User Profile
        &lt;/div&gt;
    )
}</code></pre><p>Quando il componente viene montato, avvia una richiesta GET alla nostra API per ricevere i dati dell'utente per il corrispondente userId che otterremo dalle prop.</p><p>Usare try-catch ci aiuta a individuare qualsiasi errore che può capitare durante la chiamata dell'API. Ad esempio, potrebbe essere una risposta 404 o 500 dall'API.</p><p>Una volta che un errore viene individuato, siamo all'interno del blocco catch e riceviamo l'errore come parametro. Adesso siamo in grado di accedere al servizio di logging e aggiornare lo stato di conseguenza per mostrare un errore personalizzato nell'interfaccia utente.</p><h4 id="usare-la-libreria-react-error-boundary-library-raccomandazione-personale-"><strong>Usare la libreria react-error-boundary library (raccomandazione personale)</strong></h4><p>In pratica, questa libreria fonde le due tecniche precedenti. Semplifica la gestione degli errori in React e rimedia alle limitazioni del componente ErrorBoundary che abbiamo visto.</p><pre><code class="language-jsx">import { ErrorBoundary } from 'react-error-boundary'

const ErrorComponent = ({ error, resetErrorBoundary }) =&gt; {
  
  return (
    &lt;div role="alert"&gt;
      &lt;p&gt;Something went wrong:&lt;/p&gt;
      &lt;pre&gt;{error.message}&lt;/pre&gt;
    &lt;/div&gt;
  )
}

const App = () =&gt; {
  const logError = (error, errorInfo) =&gt; {
  	errorService.log({ error, errorInfo })
  }
  

  return (
    &lt;ErrorBoundary 
       FallbackComponent={ErrorComponent}
       onError={logError}
    &gt;
       &lt;MyErrorProneComponent /&gt;
    &lt;/ErrorBoundary&gt;
  );
}</code></pre><p>La libreria esporta un componente costituito dalle funzionalità ErrorBoundary che abbiamo già conosciuto e vi aggiunge alcune sfumature. Consente di passare un <code>FallbackComponent</code> come prop che dovrebbe essere renderizzato una volta individuato l'errore. </p><p>Espone anche una prop <code>onError</code> che fornisce una funzione callback quando si verifica un errore. È ottima da usare per registrare l'errore in un servizio di logging.</p><p>Ci sono alcune altre prop che sono piuttosto utili. Se vuoi saperne di più, dai pure un'occhiata alla <a href="https://www.npmjs.com/package/react-error-boundary?activeTab=readme">documentazione</a>.</p><p>Questa libreria fornisce un hook chiamato <code>useErrorHandler()</code> il cui scopo è individuare ogni errore oltre i confini come i gestori di eventi, nel codice asincrono e nel rendering lato server.</p><h4 id="registrare-gli-errori"><strong>Registrare gli errori</strong></h4><p>Individuare e gestire efficacemente gli errori è una parte, registrarli in modo appropriato è un'altra. Una volta che hai impostato la gestione degli errori nella tua applicazione, devi registrarli in modo persistente.</p><p>Il modo usato più di frequente è il caro vecchio <strong>console.log</strong>. Potrebbe andare bene durante lo sviluppo, quando vuoi un log rapido. Ma una volta che l'applicazione viene distribuita in produzione, diventa inutile. Questo perché l'errore è visibile soltanto all'interno del browser dell'utente, il che è assolutamente inefficace.</p><p>Per registrare gli errori in produzione, in quanto sviluppatore, vuoi vedere gli errori in un posto dedicato per poterli sistemare.</p><p>Per questa ragione abbiamo bisogno di un servizio di logging, creato da noi o da terze parti.</p><p>Quando usiamo servizi di logging di terze parti, il mio suggerimento personale è senza dubbio <strong>Sentry</strong>. Quindi ti consiglio vivamente di dargli un'occhiata.</p><h3 id="-mantenere-una-chiave-unica-in-tutta-la-tua-app"><strong>☝️ Mantenere una chiave unica in tutta la tua app</strong></h3><p>Mappando un array per renderizzare i suoi dati, devi sempre definire una proprietà chiave per ogni elemento. Una pratica comune che ho visto e usato in prima persona è utilizzare semplicemente l'indice di ogni elemento come chiave.</p><p>Usare la prop chiave è importante perché aiuta React a identificare l'esatto elemento che viene cambiato, aggiunto o rimosso. Immagina che lo stato del tuo componente cambi e che l'interfaccia utente debba essere ri-renderizzata con il nuovo stato. React ha bisogno di capire la differenza tra l'interfaccia precedente e quella nuova per poterla aggiornare.</p><p>"Quali elementi sono stati aggiunti/rimossi o sono cambiati?"</p><p>Per questo la chiave deve essere unica. Usare l'indice dell'elemento corrente assicura che sia unica solo in questa particolare funzione di mappatura.</p><p>Potrebbe avere questo aspetto, se avessimo deciso di mostrare i punteggi di una squadra di football di questa stagione:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={index}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Mentre è unica solamente all'interno di questa funzione di mappatura, ciò può portare a potenziali problemi. È molto comune avere più di una funzione di mappatura all'interno di un'applicazione React o anche in un componente.</p><p>Assumiamo di avere un'altra funzione di mappatura nel nostro componente per visualizzare l'elenco attuale:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData, currentRoster }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={index}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
            &lt;/br&gt;
			&lt;h3&gt;Our current roster:&lt;h3&gt;
        	{currentRoster.map((player, index) =&gt; (
            	&lt;div key={index}&gt;
                	&lt;p&gt;{player.name}&lt;/p&gt;
                    &lt;p&gt;{player.position}&lt;/p&gt;
                    &lt;p&gt;{player.jerseyNumber}&lt;/p&gt;
                    &lt;p&gt;{player.totalGoals}&lt;/p&gt;
                &lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Ci ritroviamo nella situazione in cui usiamo molte chiavi due volte all'interno del nostro componente. Consideriamo di avere 14 elementi all'interno di <code>seasonScoresData</code> e 30 in <code>currentRoaster</code>. Abbiamo usato i numeri da 0 a 13 due volte come chiave. Ora non ci stiamo più attenendo allo scopo di avere chiavi uniche.</p><p>Ciò può portare a potenziali problemi perché React potrebbe ri-renderizzare soltanto un elemento e omettere l'altro. Oppure può portare a inefficienza nell'aggiornamento dell'albero dell'interfaccia. Dai un'occhiata ai post consigliati alla fine di questa sezione per avere degli esempi più dettagliati.</p><p>Per evitare questo comportamento indesiderato, assicurati di <strong>usare sempre chiavi uniche in tutta l'applicazione</strong>. Idealmente ogni elemento nell'array dovrebbe avere il proprio id univoco da utilizzare. Ma questo non è sempre il caso, quindi puoi usare una libreria esterna come <strong>uuidv4</strong> per generare id univoci.</p><p>Con questo in mente e con l'assunzione che ogni elemento in entrambi gli array ha una proprietà id, il componente dovrebbe avere questo aspetto:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData, currentRoster }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={score.id}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
            &lt;/br&gt;
			&lt;h3&gt;Our current roster:&lt;h3&gt;
        	{currentRoster.map((player, index) =&gt; (
            	&lt;div key={player.id}&gt;
                	&lt;p&gt;{player.name}&lt;/p&gt;
                    &lt;p&gt;{player.position}&lt;/p&gt;
                    &lt;p&gt;{player.jerseyNumber}&lt;/p&gt;
                    &lt;p&gt;{player.totalGoals}&lt;/p&gt;
                &lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Se vuoi andare più a fondo, puoi leggere <a href="https://medium.com/swlh/understanding-the-importance-of-the-key-prop-in-react-f2b92ce65f45">questo post</a> (risorsa in inglese) sull'argomento.</p><h2 id="suggerimenti-per-scrivere-del-codice-react-migliore-la-ciliegina-sulla-torta"><strong>Suggerimenti per scrivere del codice React migliore – La ciliegina sulla torta</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/joanna-kosinska-_xN7UbcZ33I-unsplash.jpg" class="kg-image" alt="joanna-kosinska-_xN7UbcZ33I-unsplash" width="600" height="400" loading="lazy"></figure><p>Vorrei paragonare questa guida al processo di costruzione di una casa. La prima parte, <em>Imparare gli elementi fondamentali di React</em>, corrisponde alle solide fondamenta su cui costruisci la tua applicazione. La seconda, <em>Come realizzare dei componenti React puliti, prestanti e manutenibili</em>, è per costruire i muri.</p><p>Questa sezioni è sostanzialmente il tetto che va a completare la casa. Ecco perché l'ho chiamata <em>La ciliegina sulla torta</em>. Contiene suggerimenti più dettagliati.</p><p>La maggior parte di queste pratiche sono più opzionali delle precedenti, ma possono fare la differenza se le utilizzi nel modo appropriato.</p><h3 id="-implementare-prima-l-hook-usereducer"><strong>🪄 Implementare prima l'hook useReducer</strong></h3><p>Probabilmente uno degli hook usati più di frequente in React è <strong>useState</strong>. Nel tempo, ho creato e visto componenti con un sacco di stati differenti. Quindi è naturale che siano inondati da hook useState.</p><pre><code class="language-jsx">const CustomersMap = () =&gt; {
  const [isDataLoading, setIsDataLoading] = useState(false)
  const [customersData, setCustomersData] = useState([])
  const [hasError, setHasError] = useState(false)
  const [isHovered, setIsHovered] = useState(false)
  const [hasMapLoaded, setHasMapLoaded] = useState(false)
  const [mapData, setMapData] = useState({})
  const [formData, setFormData] = useState({})
  const [isBtnDisabled, setIsBtnDisabled] = useState(false)
  
  ...
  
  return ( ... )
}</code></pre><p>Avere molti hook useState diversi è sempre un segno importante che la dimensione e quindi la complessità di un componente sta crescendo.</p><p>Se puoi creare dei sotto-componenti più piccoli in cui trasferire alcuni stati e del JSX, si tratta di un'ottima idea, così da ripulire gli hook useState e il JSX in un colpo.</p><p>Nell'esempio qui sopra, potremmo mettere gli ultimi due stati in un componente separato che gestisce tutti gli stati e il JSX che riguardano un modulo.</p><p>Ma ci sono situazioni in cui ciò non ha senso e devi mantenere tutti questi stati differenti in un solo componente. Per migliorare la leggibilità del componente, esiste l'hook <strong>useReducer</strong>.</p><p>La documentazione ufficiale di React riporta:</p><blockquote><em><em><code>useReducer</code> </em>è solitamente da preferire a<em> <code>useState</code> </em>quando si ha una logica di stato complessa che coinvolge sotto-valori multipli o quando lo stato successivo dipende dal precedente<em>. useReducer </em>consente anche di ottimizzare le prestazioni per i componenti che attivano aggiornamenti profondi perché è possibile passare dei messaggi invece di callback<em>.</em></em></blockquote><p>Avendo questo in mente, il componente potrebbe avere questo aspetto usando <code>useReducer</code>:</p><pre><code class="language-jsx">// STATO INIZIALE
const initialState = {
  isDataLoading: false,
  customerData: [],
  hasError: false,
  isHovered: false,
  hasMapLoaded: false,
  mapData: {},
  formdata: {},
  isBtnDisabled: false
}

// REDUCER
const reducer = (state, action) =&gt; {
  switch (action.type) {
    case 'POPULATE_CUSTOMER_DATA':
      return {
        ...state,
        customerData: action.payload
      }
    case 'LOAD_MAP':
      return {
        ...state,
        hasMapLoaded: true
      }
    ...
    ...
    ...
    default: {
      return state
    }	
  }
}

// COMPONENTE
const CustomersMap = () =&gt; {
  const [state, dispatch] = useReducer(reducer, initialState)
  
  ...
  
  return ( ... )
}</code></pre><p>Il componente stesso ha un aspetto più pulito e possiede anche alcuni vantaggi come puoi vedere nella documentazione. Se sei abituato a Redux, il concetto di reducer e di come viene costruito non ti è nuovo.</p><p>La mia regola personale è di implementare l'hook useReducer se un componente supera i quattro hook useState oppure se lo stato stesso è più complesso di un semplice booleano, ad esempio. Potrebbe trattarsi di un oggetto per un modulo con dei livelli più profondi all'interno.</p><h3 id="-usare-scorciatoie-per-prop-booleane"><strong>🔌 Usare scorciatoie per prop booleane</strong></h3><p>Ci sono spesso situazioni in cui si passa una prop booleana a un componente. Ho visto molti sviluppatori fare così:</p><pre><code class="language-jsx">&lt;RegistrationForm hasPadding={true} withError={true} /&gt;</code></pre><p>Ma non è necessario farlo necessariamente così perché la ricorrenza di una prop stessa è truthy (se la prop viene passata) o falsy (se è mancante).</p><p>Ecco un approccio più chiaro:</p><pre><code class="language-jsx">&lt;RegistrationForm hasPadding withError /&gt;</code></pre><h3 id="-evitare-le-parentesi-graffe-per-le-prop-stringhe"><strong>👎 Evitare le parentesi graffe per le prop stringhe</strong></h3><p>Un caso di utilizzo simile a quello visto nel suggerimento precedente è l'utilizzo di prop stringhe:</p><pre><code class="language-jsx">&lt;Paragraph variant={"h5"} heading={"A new book"} /&gt;</code></pre><p>Non occorre usare le parentesi graffe in questo caso perché puoi usare direttamente delle stringhe all'interno delle prop. Quando vuoi attribuire un className a un elemento JSX è più probabile che tu lo faccia direttamente come una stringa.</p><p>Quando vuoi usare un'espressione JavaScript diversa da una stringa, ti servono le parentesi graffe. Ad esempio, se vuoi usare un numero o un oggetto. Questo è vero anche per le stringhe template (non restarci invischiato come ho fatto molte volte, haha).</p><p>Con delle normali stringhe, come nell'esempio, diventerebbe così:</p><pre><code class="language-jsx">&lt;Paragraph variant="h5" heading="A new book" /&gt;</code></pre><h3 id="-cancellare-attributi-non-html-distribuendo-le-prop"><strong>🧹 Cancellare attributi non-html distribuendo le prop</strong></h3><p>Vediamo un esempio rapido:</p><pre><code class="language-jsx">const MainTitle = ({ isBold, children, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ fontWeight: isBold ? 600 : 400 }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}</code></pre><p>Abbiamo appena creato un componente che renderizza un tag h1, estratto delle prop e distribuito tutte le altre potenziali prop nel tag h1. Per ora tutto ok.</p><p>Adesso siamo in grado di usarlo in altri componenti e possiamo attivare manualmente se l'h1 dovrebbe essere in grassetto o no:</p><pre><code class="language-jsx">// CON TITOLO IN GRASSETTO
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><pre><code class="language-jsx">// SENZA TITOLO IN GRASSETTO
const AboutPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle&gt;
      	Some quick lines about us!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><p>Finora, tutto funziona perfettamente senza errori o avvisi. La parte interessante inizia adesso, quando usiamo altre prop che sono direttamente distribuite al tag h1.</p><p>Quando usiamo degli attributi HTML validi come id o class, tutto funziona senza errori (ricorda --&gt; "className" diventa "class"):</p><pre><code class="language-jsx">const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold id="index-main-title" className="align-left"&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><p>Quindi tutte le prop qui sopra saranno aggiunte come attributo per l'h1 perché stiamo usando <strong><strong>{...restProps}</strong></strong>. Le prop che aggiungiamo e NON estraiamo saranno aggiunte al tag h1.</p><p>Questo è ottimo per molti casi ma può essere un problema allo stesso tempo:</p><pre><code class="language-jsx">// Page Component
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold hasPadding&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}

// MainTitle Component
const MainTitle = ({ isBold, children, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ 
        fontWeight: isBold ? 600 : 400,
        padding: restProps.hasPadding ? 16 : 0
      }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}
</code></pre><p>Nel codice qui sopra abbiamo aggiunto una nuova prop chiamata <code>hasPadding</code> al componente <code>MainTitle</code>, che è opzionale. All'interno del componente non la estraiamo dalle prop e la chiamiamo tramite <code>restProps.hasPadding</code>.</p><p>Il codice funziona, ma aprendo il tuo browser riceverai un avviso che <code>hasPadding</code> non è un attributo HTML che stai tentando di applicare al tag h1. Questo per via di <code>{...restProps}</code> sul tag h1 e perché non stiamo estraendo <code>hasPadding</code> come <code>isBold</code>, ad esempio. </p><p>Per evitare tutto ciò, estrai sempre tutti gli attributi non-HTML dalle prop, così da assicurarti che ci siano solo attributi HTML validi in <code>restProps</code> che stai distribuendo a un elemento JSX.</p><p>Nel nostro esempio sarebbe così:</p><pre><code class="language-jsx">// Page Component
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold hasPadding&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}

// MainTitle Component
const MainTitle = ({ isBold, children, hasPadding, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ 
        fontWeight: isBold ? 600 : 400,
        padding: hasPadding ? 16 : 0
      }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}
</code></pre><p>Molti di questi avvisi possono intasare la console nel browser senza che siano necessari, il che può essere sgradevole. Specialmente se stai facendo debugging.</p><p>Per ottenere più informazioni su questo argomento e altri modi per risolvere il problema, consulta <a href="https://reactjs.org/warnings/unknown-prop.html">questa sezione della documentazione</a>.</p><h3 id="-usare-le-estensioni-snippet"><strong>🔥 Usare le estensioni snippet</strong></h3><p>In Visual Studio Code, ad esempio, sono disponibili alcune estensioni che migliorano la tua produttività. Tra queste ci sono le <strong>estensioni snippet</strong>.</p><p>Il loro grande vantaggio è che non devi scrivere tutto il codice boilerplate di nuovo. Immagina di star creando molti nuovi componenti a di dover digitare tutto ancora e ancora:</p><pre><code class="language-jsx">import React from 'react'

const GoogleMap = () =&gt; {

}

export default GoogleMap</code></pre><p>Con questi snippet devi soltanto digitare <strong><strong><code>rafce</code></strong></strong>, ad esempio, premere tab ed ecco che hai lo stesso codice boilerplate. È davvero un salva tempo e accelera lo sviluppo.</p><p><strong>Ma usali con attenzione!</strong> Non consiglio di usare snippet a tutti gli sviluppatori. Secondo me, i principianti non dovrebbero usare alcuno snippet e dovrebbero scrivere il boilerplate a mano. Quando lo fai, ottieni una memoria muscolare che esprime tutto ciò che hai imparato.</p><p>Se lo hai fatto così spesso da poterlo scrivere nel sonno e diventa noioso, allora è il momento giusto di usare gli snippet.</p><p>Ecco i miei consigli:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-14.55.02.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-14.55.02" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-15.05.01.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-15.05.01" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-15.06.59.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-15.06.59" width="600" height="400" loading="lazy"></figure><h3 id="-scrivere-un-frammento-quando-non-necessario-un-div"><strong>❌ Scrivere un frammento quando non è necessario un div</strong></h3><p>Un componente React può renderizzare un solo tag HTML alla volta nella sua radice. Quindi volendo renderizzare due elementi adiacenti, otterrai il famoso errore <strong><strong>Adjacent JSX elements must be wrapped in an enclosing tag</strong> </strong>(gli elementi JSX adiacenti devono essere racchiusi in un tag).</p><pre><code class="language-jsx">const InfoText = () =&gt; {
	
  // Darà un errore
  return (
    &lt;h1&gt;Welcome!&lt;/h1&gt;
    &lt;p&gt;This our new page, we're glad you're are here!&lt;/p&gt;
  )
}</code></pre><p>Quindi, cosa puoi fare? Racchiudi semplicemente l'output in un frammento, che soddisfa React e non aggiunge nessun elemento extra nel browser.</p><pre><code class="language-jsx">const InfoText = () =&gt; {
	
  return (
  	&lt;&gt;
      &lt;h1&gt;Welcome!&lt;/h1&gt;
      &lt;p&gt;This our new page, we're glad you're are here!&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><p>Naturalmente è possibile risolvere tutto ciò anche con un tag div. Ma usare un div dopo l'altro crea una cosa chiamata <strong>inferno dei div</strong> nel browser, in cui ci sono un sacco di tag div annidati senza senso.</p><p>Quindi ogni volta che devi usare un tag per racchiudere qualcosa in React ma non ti serve necessariamente un tag HTML, allora usa semplicemente un frammento.</p><h3 id="-integrare-i-tag-a-chiusura-automatica-quando-i-figli-non-sono-necessari"><strong>👈 Integrare i tag a chiusura automatica quando i figli non sono necessari</strong></h3><p>Dalla mia esperienza posso dire che questo suggerimento è spesso trascurato, ma rende del codice molto più pulito con uno sforzo minimo.</p><p>In React, hai la possibilità di passare elementi figli a un componente, che poi sono disponibili al componente tramite la sua proprietà figlia. Questi componenti sono spesso chiamati <strong>componenti compositi</strong>.</p><p>In questo caso, devi utilizzare un tag di apertura e un tag di chiusura, naturalmente:</p><pre><code class="language-jsx">&lt;NavigationBar&gt;
  &lt;p&gt;Home&lt;/p&gt;
  &lt;p&gt;About&lt;/p&gt;
  &lt;p&gt;Projects&lt;/p&gt;
  &lt;p&gt;Contact&lt;/p&gt;
&lt;/NavigationBar&gt;</code></pre><p>Ma quando non sono necessari dei figli, non ha senso usare un tag di apertura e un tag di chiusura, vero?</p><pre><code class="language-jsx">&lt;NavigationBar&gt;&lt;/NavigationBar&gt;</code></pre><p>Invece di fare così, consiglio di usare il componente come un elemento a chiusura automatica come il tag HTML input, che allo stesso modo non accetta figli.</p><pre><code class="language-jsx">&lt;NavigationBar /&gt;</code></pre><p>Ha un aspetto molto più pulito, vero?</p><h3 id="-seguire-le-convenzioni-di-nomenclatura-pi-comuni"><strong>✅ Seguire le convenzioni di nomenclatura più comuni</strong></h3><p>Il senso alla base delle convenzioni di nomenclatura è che è più semplice riconoscere il tipo di elemento con cui hai a che fare, oltre ad avere qualcosa nel tuo codice in comune con la comunità.</p><p>Da questo punto di vista, ci sono due principali convenzioni di nomenclatura che coinvolgono React e JavaScript che dovresti seguire:</p><h4 id="usare-pascalcase-in-componenti-interfacce-o-alias-di-tipo"><strong>Usare PascalCase in componenti, interfacce o alias di tipo</strong></h4><pre><code class="language-jsx">// Componente React
const LeftGridPanel = () =&gt; {
  ...
}

// Interfaccia Typescript
interface AdminUser {
  name: string;
  id: number;
  email: string;
}

// Alias di tipo Typescript
type TodoList = {
	todos: string[];
    id: number;
    name: string;
}

</code></pre><h4 id="usare-camelcase-per-tipi-di-dati-javascript-come-variabili-array-oggetti-funzioni-e-cos-via"><strong>Usare camelCase per tipi di dati JavaScript come variabili, array, oggetti, funzioni e così via</strong></h4><pre><code class="language-jsx">const getLastDigit = () =&gt; { ... }

const userTypes = [ ... ]

</code></pre><p>Dare nomi ai componenti React in PascalCase è molto importante, perché se hai un linter configurato per React, ma i nomi dei tuoi componenti sono in camelCase e stai usando degli hook al loro interno, otterrai un messaggio di avvertimento tutte le volte che gli hook sono consentiti solo nei componenti. Questo perché il linter riconosce un componente React se è scritto in PascalCase oppure no.</p><p>Può essere spiacevole, ma si sistema rapidamente adottando le convenzioni stabilite.</p><h3 id="-ripulire-il-codice-per-prevenire-attacchi-xss"><strong>🧨 Ripulire il codice per prevenire attacchi XSS</strong></h3><p>Magari ti sei trovato in una situazione in cui occorre usare la proprietà <code>dangerouslySetInnerHTML</code> su un elemento in React. Sostanzialmente è l'equivalente di React di <code>innerHTML</code> che potresti conoscere da JavaScript.</p><p>Quindi usandola puoi impostare direttamente l'HTML da React.</p><p>Consideriamo il seguente esempio, in cui vogliamo renderizzare una stringa HTML all'interno di un div. La stringa può venir fuori da un bell'editor di testo in cui c'è già dell'HTML formattato.</p><pre><code class="language-jsx">const Markup = () =&gt; {
  const htmlString = "&lt;p&gt;This is set via dangerouslySetInnerHTML&lt;/p&gt;"
  
  return (
    &lt;div dangerouslySetInnerHTML={{ __html: htmlString }} /&gt;
  )
}</code></pre><p>Il termine <strong><strong>dangerously</strong></strong> è scelto intenzionalmente. Usare questa proprietà può permettere attacchi di cross-site-scripting (XSS). Quindi è obbligatorio che il codice venga prima ripulito.</p><p>Un'ottima libreria che può aiutarti in questo è <strong><strong><a href="https://www.npmjs.com/package/dompurify">dompurify</a></strong></strong>.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Wow, è stato divertente, vero? Ho cercato di fare del mio meglio per far uscire tutto quello che avevo accatastato nella mia testa in passato. Quello che mi ha spinto a scrivere questa guida è condividere la mia esperienza con te in modo da farti evitare dei momenti difficili durante lo studio e lo sviluppo con React.</p><p>Naturalmente potrebbero esserci delle buone pratiche che consideri più importanti e che potrei aver tralasciato. Ottimo. Mi piacerebbe sentire da te quali sono per poterle aggiungere a questa guida.</p><p>Ricorda, si tratta sempre di adattarsi a ciò che utile. Quindi non dare tutto per scontato e pensa a cosa potrebbe esserti utile nella situazione in cui ti trovi. Poi puoi aggiungerlo al tuo elenco di buone pratiche.</p><p>Puoi seguire il mio percorso di sviluppo e ottenere molti altri utili consigli sulla vita da sviluppatore sul mio profilo <a href="https://www.instagram.com/jean_marc.dev/">Instagram</a>. Sono sempre disponibili ad aiutare e sono felice di ricevere feedback. Sentiti libero di contattarmi.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Prepararsi per i Colloqui di Lavoro su React – Guida a un Colloquio Tecnico sul Front-End ]]>
                </title>
                <description>
                    <![CDATA[ Un colloquio tecnico con argomento front-end è una opportunità per un potenziale datore di lavoro per accertare le tue capacità e conoscenze riguardo allo sviluppo web. L'intervistatore ti farà domande in merito alla tua esperienza e abilità in HTML, CSS e JavaScript. Probabilmente ti verranno poste anche alcune domande specifiche ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/prepararsi-per-colloqui-react/</link>
                <guid isPermaLink="false">639c87da7f728a0691a29698</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 16 Jan 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/12/Build-a-React-Code-Editor-That-Compiles-and-Executes-in-10--Languages--2-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/prepare-for-react-technical-interviews/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Prepare for React Interviews –&nbsp;Front-End Technical Interview Guide</a>
      </p><p>Un colloquio tecnico con argomento front-end è una opportunità per un potenziale datore di lavoro per accertare le tue capacità e conoscenze riguardo allo sviluppo web.<br><br>L'intervistatore ti farà domande in merito alla tua esperienza e abilità in HTML, CSS e JavaScript. Probabilmente ti verranno poste anche alcune domande specifiche sui framework come React, Angular, Vue o qualsiasi altro framework venga usato.<br><br>Potrebbe anche porti un problema di programmazione da risolvere per verificare la tue capacità in un particolare campo.<br><br>Oggi esamineremo i problemi più comuni discussi nei colloqui tecnici per sviluppo front-end, concentrandoci su React e Javascript.</p><h2 id="cosa-cercano-gli-intervistatori"><strong>Cosa Cercano gli Intervistatori</strong></h2><p>Quando vai a un colloquio per un posto come sviluppatore web front-end, preparati a discutere delle tue capacità ed esperienza con diversi linguaggi di programmazione, strumenti e framework.<br><br>Gli intervistatori vorranno anche vedere se hai una solida comprensione delle ultime tendenze e tecnologie di sviluppo web.<br><br>Preparati a parlare dei tuoi progetti precedenti e di come hai affrontato la risoluzione di vari problemi.<br><br>Assicurati di mostrare le tue capacità di risoluzione dei problemi discutendo come hai affrontato le diverse sfide durante il tuo processo di sviluppo.<br><br>Infine, non dimenticare di evidenziare i tuoi punti di forza.</p><h2 id="le-domande-pi-comuni-poste-in-un-colloquio-tecnico-per-front-end"><strong>Le Domande Più Comuni Poste in un Colloquio Tecnico per Front-End</strong></h2><p>I problemi proposti nei colloqui tecnici relativi al front-end sono piuttosto semplici e comuni. Se hai scritto codice per almeno 6 mesi, ti sarà familiare la maggior parte dei concetti che ti verrà chiesto di esporre.</p><p>Se ti eserciti con le giuste domande tenendo anche conto di un limite di tempo, dovresti essere in grado di superare il colloquio.</p><p>Esaminiamo le domande che vengono poste più di frequente.</p><h2 id="map-foreach-filter-e-reduce"><strong>Map, ForEach, Filter e Reduce</strong></h2><p>Le domande più comunemente poste (in genere all'inizio del colloquio) vertono sui metodi degli array. L'intervistatore vuole accertarsi che tu sia a tuo agio con le manipolazione degli array.</p><h4 id="il-metodo-map-"><strong>Il metodo <code>.map()</code></strong></h4><p>Il metodo <code>.map()</code> esegue iterazioni su un array, calcola qualsivoglia logica tu scriva nel corpo della funzione map e restituisce un <strong>NUOVO</strong> array.</p><pre><code class="language-javascript">let arr = [
  { id: 1, age: 12, name: 'Manu' },
  { id: 2, age: 24, name: 'Quincy' },
  { id: 3, age: 22, name: 'Abbey' },
]

let names = arr.map((el) =&gt; el.name)
console.log(names)
// Risultato: [ 'Manu', 'Quincy', 'Abbey' ]</code></pre><h4 id="il-metodo-foreach-"><strong>Il metodo <code>.forEach()</code></strong></h4><p><code>.forEach</code> è simile a <code>.map()</code> ma NON restituisce un array.</p><pre><code class="language-javascript">let arr = [
  { id: 1, age: 12, name: 'Manu' },
  { id: 2, age: 24, name: 'Quincy' },
  { id: 3, age: 22, name: 'Abbey' },
]

arr.forEach((el) =&gt; el.age+= 10);
console.log(arr);

// Risultato: 
// [
//   { id: 1, age: 22, name: 'Manu' },
//   { id: 2, age: 34, name: 'Quincy' },
//   { id: 3, age: 32, name: 'Abbey' }
// ]</code></pre><h4 id="il-metodo-filter-"><strong>Il metodo <code>.filter()</code></strong></h4><p>Questo metodo, come suggerisce il suo nome in inglese, aiuta a filtrare i valori all'interno di un array in base a una condizione booleana.</p><p>Se la condizione booleana è <code>true</code>, l'elemento viene ritornato e aggiunto all'array finale. Se la condizione è <code>false</code> l'elemento viene ignorato. Come il metodo <code>.map()</code>, anche <code>.filter()</code> restituisce un nuovo array.</p><pre><code class="language-javascript">let arr = [
  { id: 1, age: 12, name: 'Manu' },
  { id: 2, age: 24, name: 'Quincy' },
  { id: 3, age: 22, name: 'Abbey' },
]

let tooYoung = arr.filter((el) =&gt; el.age &lt;= 14);
console.log(tooYoung);

// Risultato: [ { id: 1, age: 12, name: 'Manu' } ]</code></pre><h4 id="il-metodo-reduce-"><strong>Il metodo <code>.reduce()</code></strong></h4><p>In termini semplici, <code>.reduce()</code> gestisce un valore precedente, un valore corrente e un accumulatore.</p><p>Il tipo restituito da <code>.reduce()</code> è sempre un valore singolo. Utile quando si vogliono elaborare tutti i valori in un array per ricavare un risultato cumulato.</p><pre><code class="language-javascript">// Calcola l'età totale delle tre persone.
let arr = [
  { id: 1, eta: 12, name: 'Manu' },
  { id: 2, eta: 24, name: 'Quincy' },
  { id: 3, eta: 22, name: 'Abbey' },
]

let sommaEta = arr.reduce((accumulatore, oggettoCorrente) =&gt; accumulatore + oggettoCorrente.eta, 0)
console.log(sommaEta)

// Risultato: 58</code></pre><p>Qui <code>oggettoCorrente</code> è l'oggetto che viene di volta in volta elaborato, <code>accumulatore</code> conserva il risultato che si accumula a ogni iterazione, che viene restituito alla fine nella variabile <code>sommaEta</code> . L'ultimo parametro (facoltativo, predefinito <code>0</code>) della funzione rappresenta il valore di partenza per <code>accumulatore</code>.</p><h2 id="come-implementare-i-polyfill"><strong>Come Implementare i Polyfill</strong></h2><p>Un'altra importante domanda è come è <a href="https://www.algochurn.com/frontend/polyfills">come implementare i polyfill</a> sui metodi di array <code>map()</code> e <code>filter()</code>.</p><p>Un polyfill è un frammento di codice (nei termini di architettura web JavaScript) usato per dotare di funzionalità recenti vecchie versioni di browser che non le implementano nativamente.</p><p>In poche parole, un polyfill è una implementazione personalizzata di funzioni Javascript native. Un po' come creare una tua versione dei metodi <code>.map()</code> o <code>.filter()</code>.</p><h4 id="come-usare-il-polyfill-map-"><strong>Come usare il polyfill <code>.map()</code></strong></h4><pre><code class="language-javascript">let data = [1, 2, 3, 4, 5];

Array.prototype.myMap = function (cb) {
  let arr = [];
  for (let i = 0; i &lt; this.length; i++) {
    arr.push(cb(this[i], i, this));
  }
  return arr;
};
const mapLog = data.myMap((el) =&gt; el * 2);
console.log(mapLog);</code></pre><p>Il metodo <code>myMap</code> riceve come argomento un <code>callback</code> che viene eseguito all'interno del corpo di <code>myMap</code>. Praticamente abbiamo un ciclo <code>for</code> all'interno del corpo di <code>myMap</code> che itera su <code>this.length</code>, che non è altro che la lunghezza dell'array dal quale viene chiamata la funzione <code>myMap</code>.</p><p>Visto che la sintassi di <code>map()</code> è <code>arr.map(elementoCorrente, indice, array)</code>, la funzione <code>myMap()</code> tiene conto esattamente di questo.</p><p>Inoltre visto che <code>map()</code> ritorna un nuovo array, creiamo un array vuoto e vi inseriamo i risultati. Alla fine lo restituiamo.</p><h4 id="come-usare-il-polyfill-filter-"><strong>Come usare il polyfill <code>.filter()</code></strong></h4><pre><code class="language-javascript">let data = [1, 2, 3, 4, 5];

Array.prototype.myFilter = function (cb) {
  let arr = [];
  for (let i = 0; i &lt; this.length; i++) {
    if (cb(this[i], i, this)) {
      arr.push(this[i]);
    }
  }
  return arr;
};
const filterLog = data.myFilter((el) =&gt; el &lt; 4);
console.log(filterLog);</code></pre><p><code>.filter()</code> è molto simile a <code>.map()</code> per quanto riguarda l'implementazione. Visto che <code>filter</code> filtra il risultato in base a una condizione booleana, abbiamo un costrutto <code>if()</code> supplementare per filtrare i risultati e inserirli nell'array da restituire se la condizione è soddisfatta.</p><h2 id="cos-il-debouncing"><strong>Cos'è il Debouncing?</strong></h2><p>Questa è una domanda famosa con molti utilizzi e implementazioni pratiche nel mondo reale.</p><p><code>Debouncing</code> è un metodo per far sì che una funzione non sia chiamata troppo spesso, attendendo un certo periodo di tempo rispetto all'ultima chiamata prima di invocarla nuovamente.<br><br>Pensa al sito di Amazon in questo caso. Ogni volta che digiti qualcosa nella casella di ricerca, quando ti fermi per ALMENO mezzo secondo, allora vengono restituiti i risultati. Questo è esattamente quello che si intende per debouncing.</p><p>Per implementare il debouncing, facciamo un esempio: generiamo uno username in base a quanto digitato dall'utente.</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="500" src="https://codesandbox.io/embed/proud-surf-uiu2v?file=/src/index.js" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; width: 1280px; height: 500px; border-radius: 4px; overflow: hidden;"></iframe></figure><pre><code class="language-javascript">import "./styles.css";
let inputEle = document.getElementById("inputElement");
let username = document.getElementById("username");

let generateUsername = (e) =&gt; {
  username.innerHTML = e.target.value.split(" ").join("-");
};
let debounce = function (cb, delay) {
  let timer;
  return function () {
    let context = this;
    clearTimeout(timer);
    timer = setTimeout(() =&gt; {
      cb.apply(context, arguments);
    }, delay);
  };
};

inputEle.addEventListener("keyup", debounce(generateUsername, 300));</code></pre><p>Qui stiamo cercando di creare uno username personalizzato in base all'input dell'utente. Se l'utente inizia a digitare, non vogliamo creare lo username immediatamente, ma attendiamo 300 millisecondi prima di farlo. Stiamo cercando di imitare una chiamata API qui, pertanto assumi che l'utente digiti qualcosa e che debba fare una chiamata API al backend per ottenere la risposta.</p><p>La funzione <code>debounce()</code> riceve due parametri <code>cb</code> e <code>delay</code>. <code>cb</code> è la funzione callback che viene eseguita quando scade il tempo.<br><br>Usiamo <code>setTimeout()</code> per creare un timer, il che vuol dire che la funzione all'interno del corpo di <code>setTimeout()</code> verrà eseguita dopo un determinato tempo.</p><p>Il metodo <code>apply</code> viene utilizzato per chiamare la funzione di callback con l'oggetto con il quale è stata inizialmente chiamata, applicando all'oggetto gli argomenti e il contesto.</p><h2 id="cosa-sono-le-closure"><strong>Cosa sono le Closure?</strong></h2><p>Secondo la &nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures">documentazione mdn per le closure</a>, qui tradotta:</p><blockquote><em>Una <em>closure </em>è la combinazione di una funzione legata insieme (chiusa) ai riferimenti al suo stato circostante (l'ambiente lessicale). In altre parole una closure ti fornisce accesso all'ambito di una funzione più esterna da una funzione interna. In JavaScript le closure sono create ogni volta che viene creata una funzione, nella fase di creazione della funzione<em>.</em></em></blockquote><p>Per semplificare facciamo un esempio per capire il funzionamento di una closure.</p><pre><code class="language-javascript">function start() {
  var name = "Manu"; // name è una variabile locale creata da start()
  function displayName() {
    // displayName() è la funzione più interna, una `closure`
    alert(name); // usa la variabile dichiarata nella funzione genitore
  }
  displayName();
}
start(); // "Manu" viene visualizzato nell'alert box</code></pre><p>Qui una closure viene formata tra le funzioni <code>start()</code> e <code>displayName()</code>. La funzione <code>displayName()</code> ha accesso alla stessa variabile <code>name</code> presente nella funzione <code>start()</code>.</p><p>In termini semplici, la funzione interna conoscerà l'ambiente circostante (l'ambiente lessicale).</p><p>Ho scritto un intero blog su <a href="https://manuarora.in/blog/ace-the-javascript-interview#closures">come superare i colloqui su JavaScript</a> (risorsa in inglese). Puoi dargli un'occhiata se vuoi approfondire l'argomento.</p><h2 id="hook-di-react"><strong>Hook di React</strong></h2><p>Per quanto riguarda l'argomento hook di React le domande più popolari poste in un colloquio per uno sviluppatore front-end riguardano:</p><ol><li><code>useState()</code></li><li><code>useReducer()</code></li><li><code>useEffect()</code></li><li><code>useRef()</code></li><li>hook personalizzati e loro implementazione.</li></ol><h3 id="come-funziona-l-hook-usestate-"><strong>Come funziona l'hook <code>useState()</code> </strong></h3><p>Per gestire uno stato all'interno del tuo componente, <code>useState()</code> è l'hook che ti serve.<br><br>Vediamo un esempio per capire:</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="500" src="https://codesandbox.io/embed/thirsty-lewin-uo8ylh?fontsize=14&amp;hidenavigation=1&amp;theme=dark" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; width: 1280px; height: 500px; border-radius: 4px; overflow: hidden;"></iframe></figure><pre><code class="language-javscript">import { useState } from "react";
import "./styles.css";

export default function App() {
  const [title, setTitle] = useState("freeCodeCamp");
  const handleChange = () =&gt; {
    setTitle("FCC");
  };
  return (
    &lt;div className="App"&gt;
      &lt;h1&gt;{title} useState&lt;/h1&gt;
      &lt;button onClick={handleChange}&gt;Change Title&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p><code>useState()</code> restituisce due valori: una variabile che contiene il valore dello stato (<code>title</code> nell'esempio), e una funzione per cambiare il valore dello stato (<code>setTitle</code> nell'esempio).</p><p>Nel codice qui sopra abbiamo creato uno stato chiamato <code>title</code> &nbsp;per conservare il titolo della pagina. Il valore iniziale passato è "freeCodeCamp".</p><p>Quando si fa click sul bottone "Change Title", possiamo usare la funzione <code>setTitle()</code> per modificare la variabile dello stato <code>title</code> in "FCC".</p><p><code>useState()</code> è la tua risorsa di riferimento per la gestione dello stato in un componente funzionale.</p><h3 id="come-funziona-l-hook-usereducer-"><strong>Come funziona l'hook <code>useReducer()</code></strong></h3><p>In parole povere, <code>useReducer()</code> è un modo interessante per gestire lo stato nella tua applicazione. È più strutturato e aiuta a mantenere stati complessi nella tua applicazione.</p><p>Ecco un esempio per comprendere l'hook <code>useReducer</code>:</p><figure class="kg-card kg-embed-card"><iframe width="1280" height="500" src="https://codesandbox.io/embed/ecstatic-marco-o8wh00?fontsize=14&amp;hidenavigation=1&amp;theme=dark" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; width: 1280px; height: 500px; border-radius: 4px; overflow: hidden;"></iframe></figure><pre><code class="language-javscript">import "./styles.css";
import { useReducer } from "react";

const initialState = { title: "freeCodeCamp", count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case "change-title":
      return { ...state, title: "FCC" };
    case "increment-counter":
      return { ...state, count: state.count + 1 };
    default:
      throw new Error();
  }
}

export default function App() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    &lt;&gt;
      &lt;div className="App"&gt;
        &lt;h1&gt;{state.title} CodeSandbox&lt;/h1&gt;
        &lt;button onClick={() =&gt; dispatch({ type: "change-title" })}&gt;
          Change Title
        &lt;/button&gt;
        &lt;button onClick={() =&gt; dispatch({ type: "increment-counter" })}&gt;
          Increment Counter
        &lt;/button&gt;
      &lt;/div&gt;
      &lt;p style={{ textAlign: "center" }}&gt;{state.count}&lt;/p&gt;.
    &lt;/&gt;
  );
}
</code></pre><p>L'hook <code>useReducer()</code> riceve due parametri, la funzione (parametro <code>reducer</code>) che verrà utilizzata per la gestione dello stato e un valore di stato iniziale (parametro <code>initialState</code>).<br><br>La funzione reducer è una implementazione basata so uno <code>switch-case</code> che ritorna lo stato finale del valore che <code>useReducer()</code> usa internamente per fornirlo al componente.</p><p>I valori ritornati da <code>useReducer()</code> sono <code>state</code> e <code>dispatch</code>. <code>state</code> è l'effettivo valore dello stato che può essere usato all'interno del componente. Nel nostro caso, lo stato ha due valori: <code>title</code> e <code>count</code>. Questi valori possono essere manipolati usando il metodo <code>dispatch()</code> che viene ritornato da <code>useReducer()</code>.</p><p>Nel caso qui sopra, per modificare il titolo abbiamo gestito un caso chiamato <code>change-title</code> nell'istruzione di <code>switch</code>. Questo caso è stato attivato tramite <code>dispatch({ type: "change-title" })</code>, che modificherà lo stato, in particolare il valore di <code>title</code> .<br><br>Alla stessa stregua la procedura viene seguita per aumentare il contatore <code>count</code> visualizzato nell'applicazione gestendo il caso <code>increment-counter</code>.<br><br>Come detto in precedenza, si tratta di un modo interessante per implementare la gestione dello stato nella tua applicazione. 😉</p><h3 id="come-funziona-l-hook-useeffect-"><strong>Come funziona l'hook <code>useEffect()</code> </strong></h3><p>Mettila così: se vuoi ottenere un effetto collaterale rispetto a una variabile di stato quando il suo valore viene modificato, puoi usare l'hook <code>useEffect()</code> per attivarlo.<br><br>Ad esempio diciamo che il valore di una casella di input cambia e vuoi chiamare un'API dopo che il valore viene modificato. Puoi scrivere la logica per la gestione dell'API all'interno di <code>useEffect()</code>.</p><pre><code class="language-javascript">import React, {useState, useEffect} from 'react';

export const App = () =&gt; {
    const [value, setValue] = useState('');
    useEffect(() =&gt; {
      console.log('value changed: ', value);
    }, [value])
	return &lt;div&gt;
        	&lt;input type="text" name="username" value={value} onChange={(e) =&gt; setValue(e.target.value)} /&gt;
        &lt;/div&gt;
}</code></pre><p>Qui abbiamo una casella di input che ha un valore di stato <code>value</code> ad essa collegato. Questo valore cambia quando l'utente prova a digitare qualcosa.<br><br>Una volta che il valore è stato aggiornato e presentato, il blocco di codice all'interno di <code>useEffect()</code> viene eseguito stampando alla console il valore aggiornato della variabile di stato <code>value</code>.<br><br>Un buon caso d'uso per <code>useEffect()</code> può essere l'implementazione di chiamate API. Diciamo che vuoi chiamare una API passando come valore il contenuto della casella di input. <code>useEffect</code> sarà il posto migliore dove eseguire l'implementazione.</p><p><code>useEffect</code> riceve come secondo argomento un array di dipendenze, nel nostro caso <code>[value]</code>. </p><p>Questo significa che OGNI VOLTA che il valore di una variabile di stato inclusa nell'array di dipendenze (nel nostro caso <code>value</code>) CAMBIA, la funzione all'interno di <code>useEffect</code> viene eseguita, se si passa un array di dipendenze vuoto, la funzione verrà eseguita solo una volta.</p><h3 id="come-funziona-l-hook-useref-"><strong>Come funziona l'hook <code>useRef()</code></strong></h3><p><code>useRef()</code> ti consente di modificare il DOM (tuttavia questa non è l'unica caratteristica dell'hook).</p><p>Secondo la documentazione:</p><blockquote><em><em>useRef </em>ritorna un oggetto ref mutabile la cui proprietà .current è inizializzata con l'argomento passato <em>(initialValue). </em>L'oggetto restituito persisterà per l'intero ciclo di vita del componente<em>.</em></em></blockquote><p>Semplificando, usiamo <code>useRef</code> se vogliamo persistere il valore di qualcosa per tutta la durata di vita del componente. L'implementazione base di <code>useRef</code> si applica a elementi DOM. Facciamo un esempio:</p><pre><code class="language-javascript">function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () =&gt; {
    // `current` punta all'elemento input testo montato nel DOM
    inputEl.current.focus();
  };
  return (
    &lt;&gt;
      &lt;input ref={inputEl} type="text" /&gt;
      &lt;button onClick={onButtonClick}&gt;Focus the input&lt;/button&gt;
    &lt;/&gt;
  );
}</code></pre><p>In questo caso stiamo assegnando una proprietà <code>ref</code> all'elemento <code>input</code>, che sarà referenziato dalla variabile <code>inputEl</code> che abbiamo creato.</p><p>Questo elemento <code>input</code> può ora essere manipolato in qualsiasi modo vogliamo. Possiamo modificare l'attributo <code>style</code> abbellendo l'elemento, possiamo estrarre la proprietà <code>value</code> per vedere che valore contiene, e così via.</p><p>Nell'esempio qui sopra, quando facciamo click sul bottone "Focus the input", l'elemento input riceve il focus e possiamo immediatamente iniziare a scriverci dentro. Lo facciamo chiamando <code>inputEl.current.focus()</code>, in pratica è il metodo <code>focus()</code> presente nell'oggetto <code>current</code>.</p><h3 id="cosa-sono-gli-hook-personalizzati"><strong>Cosa sono gli hook personalizzati?</strong></h3><p>Una delle domande che ho visto porre con più frequenza nei colloqui relativi al front-end è la richiesta di <a href="https://www.algochurn.com/frontend/usekeypress-custom-hook">creare un hook personalizzato per gli eventi da tastiera</a>.</p><p>Abbiamo visto tanti hook, ma l'intervistatore potrebbe chiederti di crearne uno tuo. Per alcuni potrebbe essere impegnativo ma con un poco di pratica diventa molto più facile.</p><p>Cerchiamo di capire cos'è un hook:</p><p>L'utilizzo base di un hook personalizzato è di estrarre la logica di una funzione in un suo proprio componente.</p><p>Immagina cosa succederebbe se dovessi catturare la pressione del tasto Invio all'interno di ognuno dei tuoi componenti. Invece di scrivere la logica per un event listener in ogni componente, puoi estrarre detta logica in un componente a sé stante e usarlo ovunque tu voglia (proprio come usiamo <code>useState()</code> o <code>useEffect()</code>).</p><p>Ci sono alcune condizioni affiché una funzione possa essere considerata un hook:</p><ol><li>Il nome del componente deve iniziare sempre con la parola chiave <code>use</code>.</li><li>Possiamo decidere se debba ricevere argomenti, e cosa, se necessario, dovrebbe ritornare.</li></ol><pre><code class="language-javascript">// Hook personalizzato: useAvailable
function useAvailabe(resource) {
  const [isAvailable, setIsAvailable] = useState(null);

  // ...

  return isAvailable;
}

// Utilizzo:
  const isAvailable = useAvailable(cpu);
</code></pre><p>Qui, non importa quanto volte chiamiamo <code>useState</code> e <code>useEffect</code> all'interno dell'hook personalizzato, saranno completamente indipendenti rispetto al punto nel quale lo utilizziamo.<br><br>Facciamo un esempio nel quale creiamo un hook personalizzato per conservare dei valori in <code>localStorage</code>.</p><h3 id="come-creare-un-hook-personalizzato-esempio-uselocalstorage"><strong>Come creare un hook personalizzato &nbsp;– esempio useLocalStorage</strong></h3><p>L'hook personalizzato <code>useLocalStorage</code> è un modo per salvare i dati in <code>localStorage</code>. Otteniamo e impostiamo i valori all'interno di <code>localStorage</code> usando coppie chiave/valore in modo che ogniqualvolta l'utente ritorna nella nostra applicazione web possa avere a disposizione dati memorizzati nei precedenti utilizzi.</p><p>L'implementazione che segue è un semplice elemento <code>select</code> che, una volta modificato il suo valore, salva il dato nel <code>localStorage</code>.</p><p><code>useLocalStorage.js</code></p><pre><code class="language-javascript">// Use Local Storage Custom Hook
import { useState } from 'react';

function useLocalStorage(key, initialValue) {
  const [storedValue, setStoredValue] = useState(() =&gt; {
    if (typeof window === 'undefined') {
      return initialValue;
    }
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      console.log(error);
      return initialValue;
    }
  });
  const setValue = (value) =&gt; {
    try {
      const valueToStore =
        value instanceof Function ? value(storedValue) : value;
      setStoredValue(valueToStore);
      if (typeof window !== 'undefined') {
        window.localStorage.setItem(key, JSON.stringify(valueToStore));
      }
    } catch (error) {
      console.log(error);
    }
  };
  return [storedValue, setValue] as const;
}

export default useLocalStorage;
</code></pre><p><code>App.js</code></p><pre><code class="language-javascript">import * as React from 'react';
import './style.css';
import useLocalStorage from './useLocalStorage';

export default function App() {
  const [storedValue, setStoredValue] = useLocalStorage(
    'select-value',
    'light'
  );

  return (
    &lt;div&gt;
      &lt;select
        className="select"
        value={storedValue}
        onChange={(e) =&gt; setStoredValue(e.target.value)}
      &gt;
        &lt;option value="dark"&gt;Dark&lt;/option&gt;
        &lt;option value="light"&gt;Light&lt;/option&gt;
      &lt;/select&gt;
      &lt;p className="desc"&gt;
        Value from local storage: &lt;span&gt;{storedValue}&lt;/span&gt;
      &lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><p>L'hook <code>useLocalStorage</code> riceve due parametri, il nome della chiave da utilizzare in <code>localStorage</code> e un valore predefinito che deve trovarsi lì. </p><p>L'hook ritorna due valori: il valore della chiave in <code>localStorage</code> che abbiamo passato, e una funzione che consente di modificare questo valore, in questo caso <code>setStoredValue</code>.</p><p>Nel file <code>useLocalStorage.js</code> per prima cosa cerchiamo di ottenere il valore salvato in <code>localStorage</code> per la chiave passata usando il metodo <code>localStorage.getItem()</code>. Se la chiave esiste otteniamo il valore che, se esiste, ritorniamo elaborandolo con <code>JSON.parse()</code>. Altrimenti il contenuto della variabile <code>initialValue</code> viene fornito come valore predefinito.<br><br>La funzione <code>setLocalStorage()</code> gestisce il fatto che il valore passato sia una funzione o un semplice valore di variabile. Inoltre si occupa di impostare il valore in <code>localStorage</code> usando la funzione <code>localStorage.setItem()</code>.</p><h2 id="come-distinguersi-come-sviluppatore-creando-progetti-secondari">Come Distinguersi Come Sviluppatore Creando Progetti Secondari</h2><p>La cosa che ha sempre funzionato per me e mi ha aiutato a spiccare sono i progetti secondari che ho creato.</p><p>Secondo me, non devi costruire 10 progetti secondari di base fatti in serie. Prova invece a costruire uno o due progetti davvero buoni nei quali puoi implementare tutti i concetti di React/HTML/CSS/JavaScript e tutto ciò che hai imparato.</p><p>Supponiamo che l'intervistatore abbia 14 colloqui in una settimana e debba esaminare il curriculum di altrettanti candidati. È più probabile che sia interessato al tuo profilo perché hai creato un sito Web che genera <em>link shortener e addebita 1 dollaro dopo ogni 1000 visite al link </em>anziché un clone Amazon / Netflix.</p><p>Ancora una volta, non c'è nulla di sbagliato nel creare cloni per esercitare le tue abilità. Tuttavia è sempre bello avere almeno 1 progetto che ti aiuta a distinguerti nella folla.<br><br>Inoltre, la creazione di progetti secondari ti aiuterà a progredire come sviluppatore. È improbabile sapere tutto in anticipo quando si crea un progetto da zero. Lungo il percorso, dovrai imparare e padroneggiare molte abilità diverse.</p><h2 id="pratica-pratica-pratica-"><strong>Pratica, Pratica, Pratica.</strong></h2><p>C'è un detto famoso che dice:</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/Tweet.html?creatorScreenName=mannupaaji&amp;dnt=false&amp;embedId=twitter-widget-0&amp;features=eyJ0ZndfdGltZWxpbmVfbGlzdCI6eyJidWNrZXQiOlsibGlua3RyLmVlIiwidHIuZWUiLCJ0ZXJyYS5jb20uYnIiLCJ3d3cubGlua3RyLmVlIiwid3d3LnRyLmVlIiwid3d3LnRlcnJhLmNvbS5iciJdLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2hvcml6b25fdGltZWxpbmVfMTIwMzQiOnsiYnVja2V0IjoidHJlYXRtZW50IiwidmVyc2lvbiI6bnVsbH0sInRmd190d2VldF9lZGl0X2JhY2tlbmQiOnsiYnVja2V0Ijoib24iLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3JlZnNyY19zZXNzaW9uIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19zaG93X2J1c2luZXNzX3ZlcmlmaWVkX2JhZGdlIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19jaGluX3BpbGxzXzE0NzQxIjp7ImJ1Y2tldCI6ImNvbG9yX2ljb25zIiwidmVyc2lvbiI6bnVsbH0sInRmd190d2VldF9yZXN1bHRfbWlncmF0aW9uXzEzOTc5Ijp7ImJ1Y2tldCI6InR3ZWV0X3Jlc3VsdCIsInZlcnNpb24iOm51bGx9LCJ0Zndfc2Vuc2l0aXZlX21lZGlhX2ludGVyc3RpdGlhbF8xMzk2MyI6eyJidWNrZXQiOiJpbnRlcnN0aXRpYWwiLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2V4cGVyaW1lbnRzX2Nvb2tpZV9leHBpcmF0aW9uIjp7ImJ1Y2tldCI6MTIwOTYwMCwidmVyc2lvbiI6bnVsbH0sInRmd19kdXBsaWNhdGVfc2NyaWJlc190b19zZXR0aW5ncyI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9LCJ0ZndfdmlkZW9faGxzX2R5bmFtaWNfbWFuaWZlc3RzXzE1MDgyIjp7ImJ1Y2tldCI6InRydWVfYml0cmF0ZSIsInZlcnNpb24iOm51bGx9LCJ0Zndfc2hvd19ibHVlX3ZlcmlmaWVkX2JhZGdlIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19zaG93X2dvdl92ZXJpZmllZF9iYWRnZSI6eyJidWNrZXQiOiJvZmYiLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3Nob3dfYnVzaW5lc3NfYWZmaWxpYXRlX2JhZGdlIjp7ImJ1Y2tldCI6Im9mZiIsInZlcnNpb24iOm51bGx9LCJ0ZndfdHdlZXRfZWRpdF9mcm9udGVuZCI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9fQ%3D%3D&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1566350128767987712&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fprepare-for-react-technical-interviews%2F&amp;sessionId=b508e138956b60781c1cbcf9dc751b8486d3e930&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=a3525f077c700%3A1667415560940&amp;width=550px" data-tweet-id="1566350128767987712" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 297px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>(traduzione: "Ogni intervista è un'intervista di prova per te fino a quando non ottieni il tuo primo lavoro front-end"), e questo è vero in larga misura.</p><p>Io stesso ho fallito centinaia di volte prima di ottenere il mio primo lavoro. È il feedback costante e le iterazioni che devi fare per ottenere ciò che desideri.<br><br>Nel nostro caso, ottenere un posto come sviluppatore front-end diventa facile quando:</p><ul><li>Hai una profonda conoscenza delle tue abilità, React in questo caso (oltre a HTML, CSS e JS).</li><li>Hai un gruppo di progetti da mostrare, che ti mettono in evidenza.</li><li>Sei disposto a dedicare tempo e sforzo per imparare nuove cose e metterti alla prova.</li><li>Leggi regolarmente il blog di freeCodeCamp e ti eserciti qui con le domande (😉)</li></ul><h2 id="conclusione"><strong><strong><strong>Conclusion</strong></strong>e</strong></h2><p>Ci sono molte domande su cui esercitarsi per un <em>machine-coding round.</em></p><blockquote> N.d.T.<br>Si tratta di risolvere un problema di progettazione in un paio d'ore. Richiede la progettazione e la scrittura del codice per una soluzione pulita, lineare ed espandibile in base a uno specifico insieme di requisiti. In genere segue un processo di revisione dove l'intervistatore esamina il codice e tenta di capire la logica del progetto. </blockquote><p>L'intervistatore può porti diversi gruppi di domande per mettere alla prova le tue abilità. <br><br>Puoi usare <a href="https://algochurn.com/"><strong><strong>Algochurn</strong></strong></a> per esercitarti con le più <a href="https://www.algochurn.com/blog/top-5-react-front-end-questions-to-practice-before-a-technical-interview-round">popolari domande per colloqui su JavaScript</a>, <a href="https://algochurn.com/frontend">per domande per colloqui su React</a> e <a href="https://algochurn.com/problems">domande relative agli algoritmi</a> (tutte le risorse collegate sono in lingua inglese) poste in un colloquio tecnico sul front-end con i loro approcci e soluzioni.</p><p>Se hai una qualsiasi domanda, contattami via &nbsp;<a href="https://twitter.com/mannupaaji">Twitter(@mannupaaji)</a> e/o sul mio sito web<a href="https://manuarora.in/"> (manuarora.in)</a></p><p>Buona fortuna e buona programmazione! 👑🫡</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Integrare Material UI Data Grid in React Usando Dati da una API REST ]]>
                </title>
                <description>
                    <![CDATA[ Material UI Data Grid [https://mui.com/x/react-data-grid/] (Griglia Dati di Material UI) è una tabella dati potente e flessibile. Ti facilita il compito di visualizzare dati ed è dotata di funzionalità già pronte per applicare modifiche, ordinare e filtrare, paginazione e altro ancora. In questo articolo, esamineremo le ragioni per le quali ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-integrare-material-ui-data-grid-in-react/</link>
                <guid isPermaLink="false">639897dbf2fe0506fb9b908a</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Fri, 23 Dec 2022 16:10:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/12/datagrid_italiano.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-integrate-material-ui-data-grid-in-react-using-data-from-a-rest-api/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Integrate the Material UI Data Grid in React Using Data from a REST API</a>
      </p><p><a href="https://mui.com/x/react-data-grid/">Material UI Data Grid</a> (Griglia Dati di Material UI) è una tabella dati potente e flessibile. Ti facilita il compito di visualizzare dati ed è dotata di funzionalità già pronte per applicare modifiche, ordinare e filtrare, paginazione e altro ancora.</p><p>In questo articolo, esamineremo le ragioni per le quali dovresti usare la <strong>Material UI</strong> <strong>Data Grid </strong>nel tuo progetto. Successivamente vedremo come installare e configurare Material UI Data Grid, come utilizzare e integrare un'API RESTful e abilitare la paginazione oltre all'ordinamento e il filtro dati.</p><h2 id="sommario"><strong>Sommario</strong></h2><ul><li><a href="#introduzione-a-material-ui-data-grid">Introduzione a Material UI Data Grid</a></li><li><a href="#perche-usare-material-ui-data-grid">Perché usare Material UI Data Grid</a></li><li><a href="#installazione-e-configurazione-di-react-e-griglia-dati-di-material-ui">Installazione e Configurazione di React e della Material UI Data Grid</a></li><li><a href="#integrazione-e-utilizzo-api">Integrazione e Utilizzo API</a></li><li><a href="#visualizzare-risultati-api-nella-data-grid-material-ui">Visualizzare Risultati dall'API nella Material UI Data Grid</a></li><li><a href="#conclusione">Conclusione</a></li></ul><p>Puoi vedere la versione video (in inglese) di questo articolo qui sotto oppure sul mio <a href="https://www.youtube.com/watch?v=S_mgSHCWCmA&amp;t=15s">canale YouTube</a>:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.179467141198714%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/S_mgSHCWCmA?start=15&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="Embedded content" loading="lazy" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 484.969px; height: 272.453px;"></iframe>
          </div>
        </div>
      </figure><h2 id="introduzione-a-material-ui-data-grid"><strong><strong>Introdu</strong>z<strong>ion</strong>e<strong> </strong>a Material UI Data Grid</strong></h2><p>Secondo la documentazione, <strong>Material UI</strong> <strong>Data Grid </strong>è una</p><blockquote>"tabella dati e griglia dati React veloce ed estensibile. È un componente ricco di funzionalità disponibile nelle versioni con licenza MIT o Commerciale".</blockquote><p>In pratica, la Material UI Data Grid è dotata di alcune caratteristiche come la possibilità di eseguire modifiche, di ordinare, filtrare, aggiornare, eseguire paginazione dei dati, esportare e altro ancora già a disposizione nella modalità predefinita.</p><p>Gli sviluppatori di Material UI hanno piani per il futuro riguardo l'implementazione di funzionalità aggiuntive come l'esportazione in formato Excel, la selezione di intervalli di dati, raggruppamenti, pivot, aggregazioni.</p><p>Per lo scopo di questo tutorial, implementeremo alcune delle caratteristiche della Material UI Data Grid con una API REST pubblica chiamata <strong><strong><a href="https://jsonplaceholder.typicode.com">JSONPlaceholder</a></strong>, </strong>che restituisce dati riguardo a post di fantasia utili per i test.</p><!--kg-card-begin: markdown--><p><a name="perche-usare-material-ui-data-grid"></a></p>
<h2 id="perchusarematerialuidatagrid">Perché usare Material UI Data Grid</h2>
<!--kg-card-end: markdown--><p>Ci sono alcune importanti ragioni per le quali vorrai usare la Material UI Data Grid:</p><ul><li>Accessibilità</li><li>Interazione con Utente</li><li>Presentazione Dati</li></ul><h4 id="accessibilit-"><strong><strong>Accessibilit</strong>à</strong></h4><p>La Material UI Data Grid offre funzionalità di accessibilità come l'evidenziazione della cella, vale a dire che ogni cella è accessibile tramite tastiera.</p><p>Fornisce anche altre funzionalità come lo spostamento tra le celle con la tastiera utilizzando determinati tasti per cambiare il focus delle celle della tabella, oltre a proprietà di gestione della dimensione dell'altezza di righe e colonne nella tabella.</p><h4 id="interazione-con-utente"><strong>Interazione con utente</strong></h4><p>Per quanto riguarda l'interazione, la Material UI Data Grid fornisce una caratteristica incorporata come la selezione della riga in modalità predefinita. Questo consente all'utente di selezionare determinate righe tramite click del mouse oppure usare determinate scorciatoie da tastiera.</p><p>La Material UI Data Grid supporta la selezione di riga singola o di righe multiple, la capacità di disabilitare la selezione di determinate righe o tutte le righe, caselle di spunta per la selezione e molto altro.</p><h4 id="presentazione-dati"><strong>Presentazione Dati</strong></h4><p>La Material UI Data Grid fornisce una caratteristica integrata che consente di esportare i dati in formato CSV.</p><p>Inoltre i dati possono essere manipolati tramite click su una intestazione di colonna. Questo attiverà le funzionalità di ordinamento e filtro.</p><p>Altra caratteristica base incorporata è lo scorrimento, che non si trova in una normale tabella come funzionalità predefinita.</p><!--kg-card-begin: markdown--><p><a name="installazione-e-configurazione-di-react-e-griglia-dati-di-material-ui"></a></p>
<h2 id="installazioneeconfigurazionedireactedimaterialuidatagrid">Installazione e Configurazione di React e di Material UI Data Grid</h2>
<!--kg-card-end: markdown--><p>Per creare un nuovo progetto in React devi avere installato <a href="https://nodejs.org/en/download/" rel="noopener noreferrer">Node.js</a>. Questo ti darà accesso al comando <code>npm</code> nel terminale. Possiamo quindi installare e usare Create React App tramite npm per creare il nostro progetto, eseguendo il seguente comando:</p><pre><code class="language-shell">npm i create-react-app
</code></pre><p>Il passo successivo è la creazione di un nuovo progetto React dal terminale eseguendo i comandi seguenti:</p><pre><code class="language-shell">npx create-react-app data-grid 
cd data-grid 
npm start
</code></pre><p>Con i comandi qui sopra abbiamo creato un progetto chiamato <code>data-grid</code>. Poi ci siamo spostati nella nuova directory del progetto appena creata e abbiamo lanciato il progetto con <code>npm start</code>.</p><p>Nella modalità predefinita il nostro progetto sarà in esecuzione nel browser all'indirizzo <code>localhost:3000</code>.</p><p>Per finire la fase di installazione, dobbiamo aggiungere due pacchetti: <strong><strong>Material UI</strong></strong> e <strong><strong>Data Grid</strong></strong> (la Griglia Dati) tramite il comando seguente:</p><pre><code class="language-shell">npm install @mui/x-data-grid @mui/material
</code></pre><h2 id="integrazione-e-utilizzo-api"><strong>Integrazione e Utilizzo <strong>API</strong></strong></h2><p>Per integrare la nostra API, dobbiamo creare nella directory <code>src</code>, che è stata creata per noi durante la generazione del progetto con Create-React-App, una nuova cartella <code>component</code>, all'interno della quale creare un file che chiameremo <code>DataTable.js</code>.</p><p>Alla fine, la nostra struttura di directory del progetto sarà tipo questa:</p><pre><code class="language-javascript">&gt; src 
    &gt; component
        &gt; DataTable.js 
.gitignore 
package-lock.json 
package.json 
README
</code></pre><p>Nel file <code>DataTable.js</code> useremo un componente funzionale, con il quale implementeremo un paio di hook di React (<code>useState</code> e <code>useEffect</code>) e l'API Fetch, integrata in JavaScript.</p><h4 id="hook-usestate"><strong>Hook <strong>useState</strong></strong></h4><p>Questo hook è una funzione integrata di React che aiuta a tenere traccia dello stato in un componente funzionale.</p><h4 id="hook-useeffect"><strong>Hook <strong>useEffect</strong></strong></h4><p>Questo hook consente di gestire effetti collaterali nel nostro componente funzionale. Alcuni di questi effetti collaterali potrebbero comprendere cose come l'aggiornamento del DOM, il recupero dati da un'API RESTful, eventi temporizzati e così via.</p><h4 id="api-fetch"><strong>API F<strong>etch </strong></strong></h4><p>Questa API in JavaScript consente ai browser di eseguire richieste HTTP ai server web. La richiesta può essere rivolta verso qualsiasi API che invii o riceva dati in formato JSON o XML.</p><p>Ora che abbiamo esplorato i concetti di hook e dell'API Fetch, generiamo il codice boilerplate per un componente funzionale nel file <code>DataTable.js</code>:</p><pre><code class="language-jsx">import React from 'react'

const DataTable= () =&gt; {
  return (
    &lt;div&gt;
      
    &lt;/div&gt;
  )
}

export default DataTable
</code></pre><p>Il prossimo passo è l'utilizzo dell'API REST da &nbsp;<a href="https://jsonplaceholder.typicode.com/posts" rel="noopener noreferrer">JSON placeholder</a>.</p><p>Per fare questo la prima cosa che dobbiamo fare è l'importazione degli hook <code>useState</code> e <code>useEffect</code>:</p><pre><code class="language-jsx">import React, { useState, useEffect } from 'react'
</code></pre><p>Successivamente creiamo due variabili destrutturando l'oggetto ritornato dall'hook <code>useState</code>:</p><pre><code class="language-jsx">const [tableData, setTableData] = useState([])
</code></pre><p>La variabile <code>tableData</code> conterrà i dati da utilizzare nella tabella e <code>setTableData</code> sarà la funzione che chiameremo per valorizzare la variabile <code>tableData</code> con i dati recuperati dall'API.</p><p>Per ultimo, per accedere ai dati quando il componente viene caricato, useremo l'API Fetch all'interno dell'hook <code>useEffect</code>:</p><pre><code class="language-jsx">useEffect(() =&gt; {
  fetch("https://jsonplaceholder.typicode.com/posts")
    .then((data) =&gt; data.json())
    .then((data) =&gt; setTableData(data))
}, [])
 console.log(tableData)
</code></pre><p>Nel codice qui sopra, all'interno di <code>useEffect</code> abbiamo fatto tre cose, nell'ordine:</p><ul><li>usato <code>fetch</code> per ricevere i dati dall'API REST JSON placeholder</li><li>convertito la risposta ottenuta nel formato JSON</li><li>passato i dati della risposta ricevuta alla funzione dichiarata in precedenza, <code>setTableData</code> </li></ul><p>Per assicurarci di avere ottenuto la giusta risposta, stampiamo i dati ricevuti nella console. Per vedere il risultato dobbiamo importare <code>DataTable.js</code> all'interno del file <code>App.js</code>:</p><pre><code class="language-jsx">import './App.css';
import DataTable from './component/DataTable';

function App() {
  return (
    &lt;div className="App"&gt;
      &lt;DataTable /&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>Alla console vedremo i risultati come segue, vale a dire un array costituito da 100 elementi oggetto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/01/console.png" class="kg-image" alt="console" width="600" height="400" loading="lazy"><figcaption>I dati in formato JSON stampati alla console</figcaption></figure><!--kg-card-begin: markdown--><p><a name="visualizzare-risultati-api-nella-data-grid-material-ui"></a></p>
<h2 id="visualizzareirisultatidellapinellamaterialuidatagrid">Visualizzare i Risultati dell'API nella Material UI Data Grid</h2>
<!--kg-card-end: markdown--><p>Per visualizzare i dati ricevuti dall'API nella griglia dobbiamo importare il pacchetto DataGrid nel nostro file <code>DataTable.js</code>:</p><pre><code class="language-jsx">import { DataGrid } from '@mui/x-data-grid'
</code></pre><p>Successivamente impostiamo la configurazione delle intestazioni delle colonne della Material UI Data Grid:</p><pre><code class="language-jsx">const columns = [
  { field: 'id', headerName: 'ID' },
  { field: 'title', headerName: 'TITOLO', width: 300 },
  { field: 'body', headerName: 'TESTO', width: 600 }
]
</code></pre><p>Ogni oggetto nell'array viene valorizzato con:</p><ul><li><code>field</code> (nome campo) è il valore della chiave corrispondente per gli oggetti ottenuti dall'API REST, <code>id</code> è l'identificativo del post, <code>title</code> è il titolo e <code>body</code> è il contenuto.</li><li><code>headerName</code> (nome intestazione) è il nome dell'intestazione della colonna che verrà visualizzato</li><li><code>width</code> (larghezza) è la larghezza in pixel assegnata alla colonna (può mancare e in questo caso verrà calcolata automaticamente da <code>DataGrid</code></li></ul><p>Per ultimo inseriamo il componente <code>DataGrid</code> nell'istruzione di <code>return</code> per presentarlo:</p><pre><code class="language-jsx">&lt;div style={{ height: 700, width: '100%' }}&gt;
     &lt;DataGrid
       rows={tableData}
       columns={columns}
       pageSize={12}
     /&gt;
   &lt;/div&gt;
</code></pre><p>Nel codice qui sopra passiamo tre proprietà al componente <code>DataGrid</code>:</p><ul><li>la proprietà <code>rows</code> (righe) contiene il risultato ottenuto dall'API REST, che si trova memorizzato nella variabile <code>tableData</code>.</li><li>la proprietà <code>colums</code> (colonne) viene valorizzata con l'array di oggetti &nbsp;<code>columns</code>, precedentemente creato, che contiene la configurazione per le colonne della tabella (identificativo, titolo e corpo del post).</li><li>la proprietà <code>pageSize</code> (dimensionePagina) &nbsp;ci aiuta a impostare un limite massimo di righe da visualizzare per videata. Come vedi l'ho impostata a 12, con i comandi di paginazione sarà possibile visualizzare i restanti dati.</li></ul><p>Il codice finale contenuto nel file <code>DataTable.js</code> è il seguente:</p><pre><code class="language-jsx">import React, { useState, useEffect } from 'react'
import { DataGrid } from '@mui/x-data-grid'

const columns = [
  { field: 'id', headerName: 'ID' },
  { field: 'title', headerName: 'Title', width: 300 },
  { field: 'body', headerName: 'Body', width: 600 }
]

const DataTable = () =&gt; {

  const [tableData, setTableData] = useState([])

  useEffect(() =&gt; {
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((data) =&gt; data.json())
      .then((data) =&gt; setTableData(data))

  }, [])

  console.log(tableData)

  return (
    &lt;div style={{ height: 700, width: '100%' }}&gt;
      &lt;DataGrid
        rows={tableData}
        columns={columns}
        pageSize={12}
      /&gt;
    &lt;/div&gt;
  )
}

export default DataTable
</code></pre><p>I risultati nel browser dovrebbero assomigliare all'immagine qui sotto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/12/risultati_griglia.png" class="kg-image" alt="grid" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/12/risultati_griglia.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2022/12/risultati_griglia.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2022/12/risultati_griglia.png 1302w" sizes="(min-width: 720px) 720px" width="1302" height="726" loading="lazy"><figcaption>Risultati presentati dalla Material UI Data Grid</figcaption></figure><p>Una cosa stupenda da notare è che abbiamo funzionalità di ordinamento e filtro già pronte, basta fare click sull'intestazione della colonna desiderata.</p><h2 id="conclusione"><strong><strong>Conclusion</strong>e</strong></h2><p>In questo articolo abbiamo imparato a usare la Material UI Data Grid, alcuni hook di React, l'acquisizione e utilizzo dati da un'API REST e molto altro.</p><p>Ecco il link al codice di questo articolo che puoi trovare su <a href="https://github.com/desoga10/data-grid">GitHub</a>.</p><p>Se hai apprezzato questo articolo, dimostrami il tuo supporto iscrivendoti al mio <a href="https://www.youtube.com/TheCodeAngle" rel="noopener noreferrer">canale YouTube</a> dove creo tutorial riguardanti le tecnologie di sviluppo web come JavaScript, React, Angular, Node.js, e altro.</p><p>Se hai qualche osservazione o domanda riguardo a questo articolo o sulla programmazione, puoi trovarmi su Twitter <a href="https://twitter.com/thecodeangle" rel="noopener noreferrer">@thecodeangle</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Eseguire Operazioni CRUD usando React, React Hooks e Axios ]]>
                </title>
                <description>
                    <![CDATA[ Se stai lavorando con React, comprendere e implementare le richieste API può essere piuttosto difficile.  In questo articolo impareremo come funziona il tutto, implementando operazioni CRUD (Creazione, Lettura,  Aggiornamento, Eliminazione) usando React, gli hook di React, React Router e Axios. Iniziamo. Come Installare Node e npm Per prima cosa ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-eseguire-operazioni-crud-usando-react/</link>
                <guid isPermaLink="false">6325e4aef91c6d07327f6ef9</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Thu, 24 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/React-CRUD-Operations-using-React-and-React-Hooks.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-perform-crud-operations-using-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Perform CRUD Operations using React, React Hooks, and Axios</a>
      </p><p>Se stai lavorando con React, comprendere e implementare le richieste API può essere piuttosto difficile. </p><p>In questo articolo impareremo come funziona il tutto, implementando operazioni CRUD (Creazione, Lettura, &nbsp;Aggiornamento, Eliminazione) usando React, gli hook di React, React Router e Axios.</p><p>Iniziamo.</p><h2 id="come-installare-node-e-npm"><strong>Come Installare Node e npm</strong></h2><p>Per prima cosa occorre installare Node nel nostro sistema. Lo useremo principalmente per eseguire il nostro codice Javascript.</p><p>Per scaricare Node, vai su <a href="https://nodejs.org/it/">https://nodejs.org/it/</a>.</p><p>Ti servirà anche il <strong>gestore di pacchetti di node</strong>, o npm, che è incorporato in Node. Puoi usarlo per installare pacchetti per le tue app Javascript. Fortunatamente è incluso assieme a Node, quindi non serve scaricarlo separatamente.</p><p>Una volta terminata l'installazione, apri un terminale o prompt dei comandi e digita <code>node -v</code> per verificare quale versione di Node hai.</p><h2 id="come-creare-la-tua-applicazione-react"><strong>Come Creare la Tua Applicazione React</strong></h2><p>Per creare un'applicazione React digita <code>npx create-react-app &lt;nome app&gt;</code><strong><strong> </strong></strong>nel terminale, oppure, in questo caso, <code>npx create-react-appreact-crud</code>.</p><p>Vedrai che verranno installati dei pacchetti.</p><p>Una volta completata l'operazione, spostati all'interno della cartella del progetto e digita <code>npm start</code>.</p><p>Vedrai il template predefinito di React, come questo:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-124754.png" class="kg-image" alt="Screenshot-2021-07-24-124754" width="600" height="400" loading="lazy"><figcaption>Il template predefinito di React</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-124858.png" class="kg-image" alt="Screenshot-2021-07-24-124858" width="600" height="400" loading="lazy"><figcaption>Il file App.js della nostra applicazione</figcaption></figure><h2 id="come-installare-il-pacchetto-semantic-ui-per-react"><strong>Come installare il pacchetto <strong><strong>Semantic UI </strong></strong>per<strong><strong> React</strong></strong></strong></h2><p>Adesso, installiamo nel progetto il pacchetto Semantic UI React. Semantic UI è una libreria di interfacce utente fatta per React che ha componenti di interfaccia utente preconfezionati come tabelle, bottoni e molte altre funzionalità.</p><p>Puoi installarlo usando uno dei comandi qui sotto, a seconda del tuo gestore di pacchetti.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">yarn add semantic-ui-react semantic-ui-css</code></pre><figcaption>Per il gestore di pacchetti Yarn</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">npm install semantic-ui-react semantic-ui-css</code></pre><figcaption>Per il gestore di pacchetti NPM</figcaption></figure><p>Occorre anche importare la libreria nel file principale dell'applicazione, vale a dire <code>index.js</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import 'semantic-ui-css/semantic.min.css'</code></pre><figcaption>Incolla questo nel file index.js</figcaption></figure><h2 id="come-costruire-l-applicazione-crud"><strong>Come Costruire l'Applicazione CRUD</strong></h2><p>Ora iniziamo a costruire l'Applicazione CRUD usando React.</p><p>Per prima cosa aggiungeremo un'intestazione all'applicazione.</p><p>Nel file <code>App.js</code>, aggiungi un'intestazione in questo modo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import './App.css';

function App() {
  return (
    &lt;div&gt;
      React Crud Operations
    &lt;/div&gt;
  );
}

export default App;
</code></pre><figcaption>Aggiungere un'intestazione all'applicazione</figcaption></figure><p>Ora assicuriamoci che sia centrata.</p><p>Dai all'attributo <code>className</code> del div genitore il valore <code>main</code>. Nel file <code>App.css</code>, useremo Flexbox per centrare l'intestazione.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import './App.css';

function App() {
  return (
    &lt;div className="main"&gt;
      React Crud Operations
    &lt;/div&gt;
  );
}

export default App;
</code></pre><figcaption>app.js con className=main nel div genitore</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-css">.main{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}</code></pre><figcaption>Il nostro file app.css&nbsp;</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-130340.png" class="kg-image" alt="Screenshot-2021-07-24-130340" width="600" height="400" loading="lazy"></figure><p>Ora l'intestazione è centrata perfettamente.</p><p>Così sembra un po' meglio, dobbiamo renderla in grassetto e aggiungere un font carino. Per farlo useremo dei tag di intestazione in cui inseriremo l'intestazione, in questo modo:</p><pre><code class="language-js">import './App.css';

function App() {
  return (
    &lt;div className="main"&gt;
      &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>Ora importiamo un font da Google Font. Vai su <a href="https://fonts.google.com/">https://fonts.google.com/</a> per sceglierne uno.</p><p>Scegli un font qualsiasi di tuo gradimento, per questo articolo io userò la famiglia di font Montserrat.</p><p>Importa il font nel file <code>App.css</code>, in questo modo:</p><pre><code class="language-css">@import url('https://fonts.googleapis.com/css2?family=Montserrat&amp;display=swap');
</code></pre><p>Ora cambiamo il font dell'intestazione.</p><pre><code class="language-css">&lt;div className="main"&gt;
      &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
&lt;/div&gt;</code></pre><p>Dai al tag di intestazione un attributo <code>className</code> del valore di <code>main-header</code>, come si vede sopra.</p><p>Qundi nel file &nbsp;<code>App.css</code>, aggiungi la proprietà <code>font-family</code>:</p><pre><code class="language-css">.main-header{
  font-family: 'Montserrat', sans-serif;
}</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-132749.png" class="kg-image" alt="Screenshot-2021-07-24-132749" width="600" height="400" loading="lazy"></figure><p>Ora vedrai che l'aspetto dell'intestazione è cambiato.</p><h2 id="come-creare-i-tuoi-componenti-crud"><strong>Come Creare i tuoi Componenti CRUD </strong></h2><p>Andremo a creare quattro componenti CRUD che saranno Create per la creazione, Read per la lettura, Update per l'aggiornamento e Delete per l'eliminazione.</p><p>All'interno della cartella <code>src</code>, crea una cartella chiamata <code>components</code> e all'interno di questa crea 3 file: <code>create.js</code>, <code>read.js</code> e <code>update.js</code>. Per le operazioni di eliminazione non servono componenti extra.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133242.png" class="kg-image" alt="Screenshot-2021-07-24-133242" width="600" height="400" loading="lazy"></figure><p>Ora implementiamo l'operazione di creazione.</p><p>Per fare questo dobbiamo usare l'API Mock. Questa API invia dati fittizi a un server che ora creeremo, solo a scopo di apprendimento.</p><p>Vai su <a href="https://mockapi.io/">https://mockapi.io/</a> e crea un account.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133456.png" class="kg-image" alt="Screenshot-2021-07-24-133456" width="600" height="400" loading="lazy"><figcaption>MockAPI</figcaption></figure><p>Crea un progetto facendo click sul bottone con il segno più.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133553.png" class="kg-image" alt="Screenshot-2021-07-24-133553" width="600" height="400" loading="lazy"><figcaption>Clicca il bottone con il più per creare un nuovo progetto</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133702.png" class="kg-image" alt="Screenshot-2021-07-24-133702" width="600" height="400" loading="lazy"></figure><p>Aggiungi il nome del progetto e clicca sul bottone Create.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133748.png" class="kg-image" alt="Screenshot-2021-07-24-133748" width="600" height="400" loading="lazy"></figure><p>Ora crea una nuova risorsa facendo click sul bottone NEW RESOURCE.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-133847.png" class="kg-image" alt="Screenshot-2021-07-24-133847" width="600" height="400" loading="lazy"></figure><p>Ti verrà chiesto il nome della risorsa (Resource Name), per cui puoi digitare un nome a piacimento.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-134009.png" class="kg-image" alt="Screenshot-2021-07-24-134009" width="600" height="400" loading="lazy"></figure><p>Elimina i campi extra come name, avatar, o createdAt, in quanto non necessari. Infine fai click su Create.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-134140.png" class="kg-image" alt="Screenshot-2021-07-24-134140" width="600" height="400" loading="lazy"></figure><p>Ora abbiamo creato la nostra API per i dati fittizi, che io ho chiamato fakeData.</p><p>Clicca su fakeData (o il nome che hai scelto), e vedrai aprirsi una nuova scheda nel browser che mostra il contenuto del database, attualmente vuoto.</p><h2 id="come-creare-un-form-per-il-componente-create"><strong>Come Creare un Form per il Componente Create</strong></h2><p>Useremo un form dalla libreria Semantic UI.</p><p>Vai su <a href="https://react.semantic-ui.com">Semantic React</a> e cerca "Form" nella barra di ricerca sulla sinistra.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-134532.png" class="kg-image" alt="Screenshot-2021-07-24-134532" width="600" height="400" loading="lazy"></figure><p>Vedrai un form come questo, quindi fai click sul bottone "Try it" in alto a destra per fare apparire il codice.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-134654.png" class="kg-image" alt="Screenshot-2021-07-24-134654" width="600" height="400" loading="lazy"></figure><p>Copia e incolla il codice nel file <code>create.js</code> in questo modo:</p><pre><code class="language-js">import React from 'react'
import { Button, Checkbox, Form } from 'semantic-ui-react'

const Create = () =&gt; (
    &lt;Form&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;First Name&lt;/label&gt;
            &lt;input placeholder='First Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;Last Name&lt;/label&gt;
            &lt;input placeholder='Last Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
        &lt;/Form.Field&gt;
        &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
    &lt;/Form&gt;
)

export default Create;</code></pre><p>Importa il componente Create nel file <code>App.js</code>.</p><pre><code class="language-js">import './App.css';
import Create from './components/create';

function App() {
  return (
    &lt;div className="main"&gt;
      &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
      &lt;div&gt;
        &lt;Create/&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>In questo modo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-135249.png" class="kg-image" alt="Screenshot-2021-07-24-135249" width="600" height="400" loading="lazy"></figure><p>Qui c'è un problema, gli elementi non sono propriamente allineati e il colore delle etichette per le caselle di testo è nero, quindi cambiamolo.</p><p>Nel file create.js, dai all'attributo <code>className</code> di <strong><strong>Form</strong></strong> il valore di <code>create-form</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React from 'react'
import { Button, Checkbox, Form } from 'semantic-ui-react'

const Create = () =&gt; (
    &lt;Form className="create-form"&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;First Name&lt;/label&gt;
            &lt;input placeholder='First Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;Last Name&lt;/label&gt;
            &lt;input placeholder='Last Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
        &lt;/Form.Field&gt;
        &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
    &lt;/Form&gt;
)

export default Create;</code></pre><figcaption>App.js</figcaption></figure><p>Quindi aggiungi la seguente classe al file App.css:</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.create-form label{
  color: whitesmoke !important;
  font-family: 'Montserrat', sans-serif;
  font-size: 12px !important;
}</code></pre><figcaption>App.css</figcaption></figure><p>Questa classe si applicherà a tutte le etichette del form alle quali verrà dato il colore <code>whitesmoke</code>. Anche il font viene modificato incrementandone la dimensione.</p><p>Ora, nella classe <code>main</code>, aggiungi una proprietà <code>flex-direction</code>. Questa proprietà imposterà la visualizzazione degli elementi su colonne, in modo che ogni elemento con <code>className</code> main venga allineato verticalmente.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.main{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #212121;
  color: whitesmoke;
  flex-direction: column;
}</code></pre><figcaption>App.css</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-140141.png" class="kg-image" alt="Screenshot-2021-07-24-140141" width="600" height="400" loading="lazy"></figure><p>Ora puoi vedere che il form ha un aspetto migliore.</p><p>Successivamente, stampiamo i dati ottenuti dai campi del form nella console. Per fare questo useremo l'hook &nbsp;di React <code>useState</code>.</p><p>Nel file create.js, importa <code>useState</code> da React.</p><pre><code class="language-js">import React, { useState } from 'react';</code></pre><p>Poi crea gli stati per il nome (firstName), il cognome (lastName) e la casella di spunta. Inizializza tutti gli stati come vuoti o <code>false</code>.</p><pre><code>import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'

export default function Create() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' /&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' /&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><p>Puoi vedere che adesso sta agendo come un componente funzionale. Quindi dobbiamo dobbiamo cambiare il componente in un componente funzionale. Questo perché possiamo usare gli hook solo in componenti funzionali.</p><p>Ora impostiamo il nome, il cognome e la casella di spunta usando rispettivamente le proprietà <code>setFirstName</code>, <code>setLastName</code> e <code>setCheckbox</code>.</p><pre><code class="language-html">&lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;

&lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;

&lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;</code></pre><p>Stiamo catturando gli stati per il nome, cognome e casella di spunta.</p><p>Crea una funzione <code>postData</code> che useremo per inviare dati all'API. All'interno della funzione scrivi questo codice:</p><pre><code class="language-js">const postData = () =&gt; {
        console.log(firstName);
        console.log(lastName);
        console.log(checkbox);
}</code></pre><p>Stiamo stampando i valori di nome (firstName), cognome (lastName) e casella di spunta (checkbox) nella console.</p><p>Assegna all'evento <code>onClick</code> del pulsante Submit la funzione <code>postData</code> in modo che venga chiamata ogni volta che si fa click sul pulsante.</p><pre><code class="language-html">&lt;Button onClick={postData} type='submit'&gt;Submit&lt;/Button&gt;</code></pre><p>Ecco l'intero codice per il file <code>create.js</code>:</p><pre><code class="language-js">import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'

export default function Create() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);
    const postData = () =&gt; {
        console.log(firstName);
        console.log(lastName);
        console.log(checkbox);
    }
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button onClick={postData} type='submit'&gt;Submit&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><p>Digita qualche valore nei campi del form e seleziona la casella di spunta. Poi fai click sul pulsante Submit. Vedrai apparire i dati nella console, in questo modo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-142717.png" class="kg-image" alt="Screenshot-2021-07-24-142717" width="600" height="400" loading="lazy"></figure><h2 id="come-usare-axios-per-inviare-richieste-all-api-mock"><strong>Come Usare Axios per Inviare Richieste all'API Mock</strong></h2><p>Usiamo Axios per inviare i dati del form al server.</p><p>Per prima cosa occorre installare Axios.</p><p>Digita semplicemente <code>npm i axios</code> per installare il pacchetto.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-174213.png" class="kg-image" alt="Screenshot-2021-07-24-174213" width="600" height="400" loading="lazy"></figure><p>Dopo avere installato il pacchetto iniziamo l'operazione di creazione.</p><p>Importa Axios all'inizio del file.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import axios from 'axios';</code></pre><figcaption>Importazione di Axios</figcaption></figure><p>Nella funzione <code>postData</code>, useremo Axios per inviare una richiesta di tipo POST.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const postData = () =&gt; {
        axios.post(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`, {
            firstName,
            lastName,
            checkbox
        })
    }</code></pre><figcaption>Invio di una Richiesta Post</figcaption></figure><p>Come puoi vedere stiamo usando <code>axios.post</code>. I parametri passati alla funzione sono l'endpoint dell'API, che abbiamo creato in precedenza, e un oggetto che contiene i dati dei campi del form.</p><p>Quando facciamo click sul bottone Submit, verrà chiamata questa funzione che invierà i dati al server API.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-174834.png" class="kg-image" alt="Screenshot-2021-07-24-174834" width="600" height="400" loading="lazy"></figure><p>Digita il tuo nome, cognome e seleziona la casella di spunta. Clicca su Submit.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-174930.png" class="kg-image" alt="Screenshot-2021-07-24-174930" width="600" height="400" loading="lazy"></figure><p>Successivamente, se controlli l'API, vedrai i tuoi nome, cognome e il valore della casella di spunta come <code>true</code> impacchettati in un oggetto.</p><h2 id="come-implementare-le-operazioni-di-lettura-e-aggiornamento"><strong>Come Implementare le Operazioni di Lettura e Aggiornamento</strong></h2><p>Per l'operazione di lettura occorre creare una pagina Read. Ci servirà anche il pacchetto React Router per navigare tra le varie pagine.</p><p>Vai su <a href="https://reactrouter.com/web/guides/quick-start">https://reactrouter.com/web/guides/quick-start</a> e installa il pacchetto usando <code>npm i react-router-dom</code>.</p><p>Dopo l'installazione occorre importare nel file <code>App.js</code> quanto segue da React Router:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import { BrowserRouter as Router, Route } from 'react-router-dom'</code></pre><figcaption>Importazione di Router e Route da React Router</figcaption></figure><p>In <code>App.js</code> inserisci il componente <code>&lt;Router&gt;</code> come elemento genitore nell'istruzione di <code>return</code>, il che significa che qualsiasi cosa si trovi come figlio di quel componente sarà in grado di usare le rotte in React.</p><pre><code class="language-js">import './App.css';
import Create from './components/create';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Create /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>Ora App.js apparirà come sopra.</p><p>Sostituisci <code>&lt;Create /&gt;</code> all'interno dell'istruzione return aggiungendo il seguente codice:</p><pre><code class="language-js">import './App.css';
import Create from './components/create';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Route exact path='/create' component={Create} /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>Qui stiamo usando il componente <code>Route</code> come Create. Abbiamo associato la rotta '/create' al componente <code>Create</code>. Quindi se vai su <a href="http://localhost:3000/create">http://localhost:3000/create</a>, vedrai la pagina presentata dal componente <code>Create</code>.</p><p>Analogamente, ci servono rotte per lettura (read) e aggiornamento (update).</p><pre><code class="language-js">import './App.css';
import Create from './components/create';
import Read from './components/read';
import Update from './components/update';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Route exact path='/create' component={Create} /&gt;
        &lt;/div&gt;
        &lt;div style={{ marginTop: 20 }}&gt;
          &lt;Route exact path='/read' component={Read} /&gt;
        &lt;/div&gt;

        &lt;Route path='/update' component={Update} /&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>Quindi crea le due rotte read e update come si vede qui sopra.</p><p>Se vai su <a href="http://localhost:3000/read">http://localhost:3000/read</a>, vedrai quanto segue:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-180318.png" class="kg-image" alt="Screenshot-2021-07-24-180318" width="600" height="400" loading="lazy"><figcaption>Read Route</figcaption></figure><p>Su <a href="http://localhost:3000/update">http://localhost:3000/update</a>, vedrai il componente <code>Update</code> in questo modo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-180440.png" class="kg-image" alt="Screenshot-2021-07-24-180440" width="600" height="400" loading="lazy"></figure><h3 id="operazione-di-lettura"><strong>Operazione di Lettura</strong></h3><p>Per l'operazione di lettura ci servirà un componente Table, pertanto portiamoci su React Semantic UI e utilizziamo una tabella dalla libreria.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Registration Date&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;E-mail address&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Premium Plan&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;John Lilki&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;September 14, 2013&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jhlilk22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;No&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Jamie Harington&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;January 11, 2014&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jamieharingonton@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Jill Lewis&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;May 11, 2014&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jilsewris22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Read.js</figcaption></figure><p>Qui puoi vedere che abbiamo una tabella con alcuni dati fittizi, ma ci serve solo un componente <code>Table.Row</code>, per cui eliminiamo il resto.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Registration Date&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;E-mail address&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Premium Plan&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;John Lilki&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;September 14, 2013&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jhlilk22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;No&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Read.js</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-182905.png" class="kg-image" alt="Screenshot-2021-07-24-182905" width="600" height="400" loading="lazy"></figure><p>Questo è il risultato della pagina Read. Abbiamo una tabella con quattro colonne, ma ne servono solo tre.</p><p>Rimuovi le colonne extra e rinomina i campi in questo modo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-183105.png" class="kg-image" alt="Screenshot-2021-07-24-183105" width="600" height="400" loading="lazy"></figure><p>Ed ecco come si presenta la pagina Read:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;First Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Last Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Checked&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Nishant&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Kumar&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Read.js</figcaption></figure><p>Ora inviamo la richiesta GET per ottenere i dati dall'API.</p><p>Ci servono i dati quando l'applicazione si carica. Quindi useremo l'hook <code>useEffect</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React, { useEffect } from 'react';

 useEffect(() =&gt; {
       
 }, [])</code></pre><figcaption>L'hook useEffect</figcaption></figure><p>Crea uno stato che conterrà i dati in arrivo. Questo sarà un array.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React, { useEffect, useState } from 'react';

const [APIData, setAPIData] = useState([]);
useEffect(() =&gt; {
       
}, [])</code></pre><figcaption>Lo stato APIData per conservare i dati in arrivo dall'API</figcaption></figure><p>Dall'hook <code>useEffect</code> inviamo la richiesta GET.</p><pre><code class="language-js"> useEffect(() =&gt; {
        axios.get(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`)
            .then((response) =&gt; {
                setAPIData(response.data);
            })
    }, [])</code></pre><p>Stiamo usando <code>axios.get</code> per inviare la richiesta GET all'API. Successivamente, se la richiesta è soddisfatta, imposteremo i dati di risposta nello stato <code>APIData</code>.</p><p>Ora popoliamo le righe della tabella in base al contenuto di <code>APIData</code>.</p><p>Per fare questo useremo la funzione <code>map</code>. Eseguirà un'iterazione sui dati dell'array e i dati verranno visualizzati.</p><pre><code class="language-js">&lt;Table.Body&gt;
  {APIData.map((data) =&gt; {
     return (
       &lt;Table.Row&gt;
          &lt;Table.Cell&gt;{data.firstName}&lt;/Table.Cell&gt;
           &lt;Table.Cell&gt;{data.lastName}&lt;/Table.Cell&gt;
           &lt;Table.Cell&gt;{data.checkbox ? 'Checked' : 'Unchecked'}&lt;/Table.Cell&gt;
        &lt;/Table.Row&gt;
   )})}
&lt;/Table.Body&gt;</code></pre><p>Stiamo mappando nome (firstName), cognome (lastName), e casella di spunta (checkbox) in base ai dati nell'API, tuttavia la casella di spunta è un po' diversa. Qui ho usato l'operatore ternario ('?'). Se <code>data.checkbox</code> è <code>true</code>, verrà visualizzato 'Checked` (spuntato), altrimenti 'Unchecked' (non spuntato).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-184955.png" class="kg-image" alt="Screenshot-2021-07-24-184955" width="600" height="400" loading="lazy"><figcaption>Read.js Output</figcaption></figure><h3 id="l-operazione-di-aggiornamento"><strong>L'Operazione di Aggiornamento</strong></h3><p>Crea un'ulteriore intestazione per l'aggiornamento e una colonna nella riga della tabella che conterrà un bottone per l'aggiornamento. Usa il bottone da Semantic UI React.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">&lt;Table.HeaderCell&gt;Update&lt;/Table.HeaderCell&gt;

&lt;Table.Cell&gt; 
  &lt;Button&gt;Update&lt;/Button&gt;
&lt;/Table.Cell&gt;</code></pre><figcaption>Creazione del bottone di aggiornamento Update</figcaption></figure><p>Quando facciamo click su questo pulsante dovremmo essere reindirizzati verso la pagina di aggiornamento. A questo scopo, ci occorre il componente <code>Link</code> da React Router.</p><p>Importa <code>Link</code> da React Router, quindi racchiudi il codice per la cella di tabella per il bottone di aggiornamento all'interno di <code>Link</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import { Link } from 'react-router-dom';

&lt;Link to='/update'&gt;
  &lt;Table.Cell&gt; 
     &lt;Button&gt;Update&lt;/Button&gt;
   &lt;/Table.Cell&gt;
&lt;/Link&gt;</code></pre><figcaption>Link per il bottone di aggiornamento Update</figcaption></figure><p>Ora se facciamo click sul bottone di aggiornamento Update saremo reindirizzati alla pagina di aggiornamento.</p><p>Per poter aggiornare i dati della riga ci serviranno i rispettivi ID, ricevuti dall'API.</p><p>Crea una funzione chiamata <code>setData</code> e collegala al bottone Update.</p><pre><code class="language-js"> &lt;Button onClick={() =&gt; setData()}&gt;Update&lt;/Button&gt;</code></pre><p>Ora dovremo passare i dati come parametro per la funzione di cui sopra.</p><pre><code> &lt;Button onClick={() =&gt; setData(data)}&gt;Update&lt;/Button&gt;</code></pre><p>All'interno della funzione stampiamo questi dati sulle console:</p><pre><code class="language-js">const setData = (data) =&gt; {
   console.log(data);
}</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-190515.png" class="kg-image" alt="Screenshot-2021-07-24-190515" width="600" height="400" loading="lazy"><figcaption>I dati nella console</figcaption></figure><p>Fai click sul bottone Update nella tabella e controlla la console. Dovresti vedere i dati dei rispettivi campi della tabella.</p><p>Ora conserviamo questi dati in localStorage.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const setData = (data) =&gt; {
        let { id, firstName, lastName, checkbox } = data;
        localStorage.setItem('ID', id);
        localStorage.setItem('First Name', firstName);
        localStorage.setItem('Last Name', lastName);
        localStorage.setItem('Checkbox Value', checkbox)
}</code></pre><figcaption>Conservazione dei dati in Local Storage</figcaption></figure><p>Stiamo destrutturando i dati in id, firstName, lastName e checkbox, quindi li inseriamo nel localStorage. Puoi usare localStorage per conservare localmente dati nel browser.</p><p>Ora, nel componente Update, ci serve un form per l'operazione di aggiornamento. Riutilizziamo il form dal componente Create. Cambiamo semplicemente il nome della funzione da Create a Update.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'
import axios from 'axios';

export default function Update() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);

    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>La pagina di aggiornamento Update.js</figcaption></figure><p>Crea un hook <code>useEffect</code> nel componente Update. Lo useremo per ottenere i dati precedentemente conservati in localStorage. Inoltre, crea un ulteriore stato per il campo ID.</p><pre><code class="language-js">const [id, setID] = useState(null);

useEffect(() =&gt; {
        setID(localStorage.getItem('ID'))
        setFirstName(localStorage.getItem('First Name'));
        setLastName(localStorage.getItem('Last Name'));
        setCheckbox(localStorage.getItem('Checkbox Value'))
}, []);</code></pre><p>Imposta i rispettivi dati in base alle tue chiavi da localStorage. Dobbiamo impostare questi valori nei campi del form. Quando la pagina di aggiornamento Update si caricherà i campi verranno automaticamente popolati.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">&lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' value={firstName} onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' value={lastName} onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' checked={checkbox} onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;</code></pre><figcaption>Impostazione dei valori nei campi del form</figcaption></figure><p>Ora, se facciamo click sul bottone Update nella pagina di lettura Read, saremo reindirizzati alla pagina di aggiornamento, dove vedremo tutti i dati del form popolati automaticamente.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-193521.png" class="kg-image" alt="Screenshot-2021-07-24-193521" width="600" height="400" loading="lazy"><figcaption>Update Page</figcaption></figure><p>Ora creiamo una richiesta di aggiornamento per i dati.</p><p>Crea una funzione chiamata &nbsp;<code>updateAPIData</code>. All'interno di questa funzione andremo a usare <code>axios.put</code> per inviare una richiesta PUT che aggiornerà i nostri dati.</p><pre><code class="language-js">const updateAPIData = () =&gt; {
    axios.put(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`, {
        firstName,
         lastName,
         checkbox
	})
}</code></pre><p>Qui puoi vedere che stiamo accodando un campo id all'endpoint dell'API.</p><p>Quando facciamo click sul bottone Update nella tabella, l'ID che rappresenta il relativo record viene conservato in localStorage. Nella pagina di aggiornamento lo recuperiamo. Successivamente conserviamo quell'ID nello stato <code>id</code>.</p><p>Dopodiché passiamo l'id all'endpoint. Questo ci consente di aggiornare il record di cui stiamo passando l'ID.</p><p>Collega la funzione <code>updateAPIData</code> al bottone Update.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">&lt;Button type='submit' onClick={updateAPIData}&gt;Update&lt;/Button&gt;</code></pre><figcaption>Collegamento di updateAPIData al bottone Update</figcaption></figure><p>Clicca sul bottone Update nella tabella nella pagina di lettura Read, modifica il cognome, quindi fai click sul bottone Update nella pagina di aggiornamento Update.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-194627.png" class="kg-image" alt="Screenshot-2021-07-24-194627" width="600" height="400" loading="lazy"><figcaption>Aggiornamento dei campi</figcaption></figure><p>Ritorna alla pagina di lettura Read oppure controlla l'API. Dovresti vedere che il cognome è stato modificato.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-194756.png" class="kg-image" alt="Screenshot-2021-07-24-194756" width="600" height="400" loading="lazy"><figcaption>L'API Mock</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-194822.png" class="kg-image" alt="Screenshot-2021-07-24-194822" width="600" height="400" loading="lazy"><figcaption>La tabella in lettura</figcaption></figure><h3 id="l-operazione-di-eliminazione"><strong>L'Operazione di Eliminazione</strong></h3><p>Aggiungi un altro pulsante alla tabella in <code>read.js</code>, che useremo per l'operazione di eliminazione.</p><figure class="kg-card kg-code-card"><pre><code>&lt;Table.Cell&gt;
   &lt;Button onClick={() =&gt; onDelete(data.id)}&gt;Delete&lt;/Button&gt;
&lt;/Table.Cell&gt;</code></pre><figcaption>Il bottone di eliminazione nella tabella in Read.js</figcaption></figure><p>Crea una funzione chiamata <code>onDelete</code> e collegala al bottone Delete. Questa funzione riceverà un ID come parametro quando si fa click sul pulsante Delete.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const onDelete = (id) =&gt; {

}</code></pre><figcaption>La funzione Delete</figcaption></figure><p>Useremo <code>axios.delete</code> per eliminare le rispettive righe.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const onDelete = (id) =&gt; {
  axios.delete(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`)
}</code></pre><figcaption>Chiamata all'API per eliminare un record</figcaption></figure><p>Fai click sul bottone Delete e controlla l'API. Dovresti vedere che il record è stato eliminato.</p><p>Dopo l'eliminazione dobbiamo ricaricare i dati della tabella.</p><p>Quindi crea una funzione per caricare i dati dall'API.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const getData = () =&gt; {
    axios.get(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`)
        .then((getData) =&gt; {
             setAPIData(getData.data);
         })
}</code></pre><figcaption>Ottenere i dati dall'API</figcaption></figure><p>Ora, nella funzione <code>onDelete</code>, dobbiamo caricare i dati aggiornati dopo avere eliminato un record.</p><figure class="kg-card kg-code-card"><pre><code>const onDelete = (id) =&gt; {
        axios.delete(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`)
     .then(() =&gt; {
        getData();
    })
}</code></pre><figcaption>Caricamento dei dati aggiornati dopo l'eliminazione di un record</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-201047.png" class="kg-image" alt="Screenshot-2021-07-24-201047" width="600" height="400" loading="lazy"><figcaption>Read table</figcaption></figure><p>Ora se se facciamo click su Delete in qualsiasi riga della tabella, verrà eliminato il record rappresentato e la tabella si aggiornerà automaticamente.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-24-201423.png" class="kg-image" alt="Screenshot-2021-07-24-201423" width="600" height="400" loading="lazy"><figcaption>Tabella Read dopo aver eliminato un record</figcaption></figure><h2 id="facciamo-qualche-miglioramento-alla-nostra-app-crud"><strong>Facciamo Qualche Miglioramento alla nostra App CRUD</strong></h2><p>Quando inviamo i dati nella pagina Create, stiamo semplicemente inserendo gli elementi nel database di dati fittizi. Dobbiamo reindirizzarci verso la pagina di lettura Read dopo che il nuovo record è stato creato nella pagina Create.</p><p>Importa <code>useHistory</code> da React Router.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import { useHistory } from 'react-router';</code></pre><figcaption>Importazione di useHistory da React Router</figcaption></figure><p>Crea una variabile chiamata <code>history</code> e associala alla funzione <code>useHistory</code>.</p><pre><code class="language-js">let history = useHistory();</code></pre><p>Quindi usa la funzione <code>history.push</code> per la redirezione verso la pagina di lettura Read appena dopo la chiamata post fatta all'API.</p><figure class="kg-card kg-code-card"><pre><code>const postData = () =&gt; {
        axios.post(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`, {
            firstName,
            lastName,
            checkbox
        }).then(() =&gt; {
            history.push('/read')
        })
    }</code></pre><figcaption>Reindirizzamento alla pagina Read dopo che la chiamata post all'API ha avuto successo</figcaption></figure><p>Usando l'hook <code>useHistory</code> l'app verrà diretta verso la pagina di lettura Read.</p><p>Fai la stessa cosa per la pagina di aggiornamento Update.</p><figure class="kg-card kg-code-card"><pre><code>import React, { useState, useEffect } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'
import axios from 'axios';
import { useHistory } from 'react-router';

export default function Update() {
    let history = useHistory();
    const [id, setID] = useState(null);
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);

    useEffect(() =&gt; {
        setID(localStorage.getItem('ID'))
        setFirstName(localStorage.getItem('First Name'));
        setLastName(localStorage.getItem('Last Name'));
        setCheckbox(localStorage.getItem('Checkbox Value'));
    }, []);

    const updateAPIData = () =&gt; {
        axios.put(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`, {
            firstName,
            lastName,
            checkbox
        }).then(() =&gt; {
            history.push('/read')
        })
    }
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' value={firstName} onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' value={lastName} onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' checked={checkbox} onChange={() =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit' onClick={updateAPIData}&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Update.js</figcaption></figure><p>Adesso sai come fare per eseguire operazioni di creazione, lettura, aggiornamento e cancellazione (CRUD) usando React e gli hook di React!</p><p>Puoi <a href="https://github.com/nishant-666/React-CRUD-Operation-V2">trovare il codice su GitHub</a> se vuoi sperimentare ulteriormente.</p><p>Buon apprendimento.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Usare localStorage con gli Hook di React per Salvare e Recuperare Elementi ]]>
                </title>
                <description>
                    <![CDATA[ localStorage è un oggetto di archiviazione web che consente a siti e app che utilizzano JavaScript di conservare coppie chiave-valore in un browser web senza scadenza. Il che vuol dire che i dati sopravvivono ad aggiornamenti della pagina (sessionStorage) e anche a riavvii del browser. Questo significa che i dati ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-usare-localstorage-con-gli-hook-di-react-per-salvare-e-recuperare-elementi/</link>
                <guid isPermaLink="false">636263059e87da0634a77797</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Thu, 10 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/11/Yellow-and-Purple-Geometric-Covid-19-General-Facts-Twitter-Post.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-use-localstorage-with-react-hooks-to-set-and-get-items/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use localStorage with React Hooks to Set and Get Items</a>
      </p><p>localStorage è un oggetto di archiviazione web che consente a siti e app che utilizzano JavaScript di conservare coppie chiave-valore in un browser web senza scadenza.</p><p>Il che vuol dire che i dati sopravvivono ad aggiornamenti della pagina (sessionStorage) e anche a riavvii del browser. Questo significa che i dati conservati nel browser rimarranno anche quando il browser viene chiuso.</p><p>In termini semplici, localStorage consente agli sviluppatori di conservare e recuperare dati nel browser.</p><p>È fondamentale capire, tuttavia, che utilizzare localStorage come un database per il tuo progetto non è buona pratica, visto che i dati andranno persi, se l'utente svuota la cache, tra le altre cose.</p><p>Gli sviluppatori usano frequentemente localStorage per aggiungere una funzionalità di tema scuro in un'applicazione, salvare una voce di una lista di cose da fare, o persistere i valori di un form immessi da un utente, oltre a tanti altri scenari.</p><p>In questo post, daremo un'occhiata a come usare localStorage con gli hook di React per salvare e recuperare facilmente elementi.</p><h2 id="cosa-sono-gli-hook-di-react"><strong>Cosa Sono gli Hook di React?</strong></h2><p>Gli hook di React sono funzioni JavaScript che puoi importare dal pacchetto React per aggiungere funzionalità ai tuoi componenti.</p><p>Gli hook consentono agli sviluppatori di usare lo stato e i metodi del ciclo di vita con i componenti funzionali. Operano anche con il codice esistente, rendendoli facilmente adottabili al codebase.</p><p>Ci servono due hook per l'uso con localStorage:</p><ul><li><code>useState()</code> – È garantito che lo stato della tua applicazione prima o poi cambierà. L'hook <code>useState()</code> è una funzione che accetta un parametro, lo stato iniziale (che potrebbe essere il valore di una variabile, un oggetto o qualsiasi altra sorta di dato nel tuo componente), e ritorna due valori: lo stato corrente e una funzione che può essere usata per aggiornare lo stato.</li><li><code>useEffect()</code> – Questo hook viene attivato in modalità predefinita alla prima presentazione del componente e ogni volta che cambia lo stato. È usato per eseguire un'attività ogni volta che cambia lo stato. Questo hook è ottimo per la configurazione di listener, il recupero di dati da un'API e l'eliminazione di listener prima che il componente sia rimosso dal DOM.</li></ul><h2 id="come-implementare-localstorage-in-react"><strong>Come implementare localStorage in React</strong></h2><p>localStorage ci fornisce un accesso all'oggetto di archiviazione del browser tramite cinque metodi:</p><ul><li><code>setItem()</code>: Questo metodo è usato per aggiungere una chiave e un valore a localStorage.</li><li><code>getItem()</code>: Questo metodo è usato per ottenere un valore da localStorage usando la chiave.</li><li><code>removeItem()</code>: Questo metodo è usato per eliminare un elemento da localStorage in base alla sua chiave.</li><li><code>clear()</code>: Questo metodo è usato per eliminare tutti gli elementi da localStorage.</li><li><code>key()</code>: Questo metodo ottiene il nome di una chiave da localStorage passando come parametro l'indice della chiave stessa. </li></ul><p>In questo post prenderemo in considerazione solo i due metodi più utilizzati: <code>setItem()</code> e <code>getItem()</code>.</p><h3 id="come-usare-il-metodo-setitem-"><strong>Come Usare il Metodo <code>setItem()</code> </strong></h3><p>Questo metodo viene usato per conservare oggetti in localStorage, assegnando un valore a una chiave. Il valore può essere di qualunque tipo, compresi testo, numero, oggetto, array, e così via.</p><p>È essenziale ricordare che i dati da conservare in localStorage devono essere salvati sotto forma di stringa con la funzione <code>JSON.stringify()</code> .</p><pre><code class="language-react">const [items, setItems] = useState([]);

useEffect(() =&gt; {
  localStorage.setItem('items', JSON.stringify(items));
}, [items]);</code></pre><p>Nel codice qui sopra, abbiamo creato prima uno stato e lo abbiamo assegnato a un array vuoto (ma il tuo potrebbe essere di qualsiasi altro tipo). Successivamente abbiamo usato <code>useEffect()</code> per aggiungere oggetti a local Storage ogniqualvolta il valore del nostro stato venga modificato. Lo facciamo passando lo stato come secondo argomento.</p><p>Fondamentalmente, questo è il codice principale responsabile dell'aggiunta di coppie chiave-valore a localStorage:</p><pre><code class="language-react">localStorage.setItem('items', JSON.stringify(items));</code></pre><p>In poche parole, il codice precedente nomina la chiave (items) e quindi le assegna un valore, ma dobbiamo prima assicurarci che i dati che stiamo aggiungendo siano sotto forma di stringa JSON.</p><p>Usiamo <code>JSON.stringify()</code> per convertire un oggetto JSON in testo JSON conservato in una stringa, che può essere trasmessa al server web.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/11/Screenshot-from-2022-11-02-14-26-54.png" class="kg-image" alt="s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645380076460_explaining+useeffect+local+storage" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/11/Screenshot-from-2022-11-02-14-26-54.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2022/11/Screenshot-from-2022-11-02-14-26-54.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2022/11/Screenshot-from-2022-11-02-14-26-54.png 1497w" sizes="(min-width: 1200px) 1200px" width="1497" height="816" loading="lazy"><figcaption>Come lavorano gli hook con localStorage per salvare un elemento</figcaption></figure><h3 id="come-usare-il-metodo-getitem-"><br><strong>Come Usare il Metodo <code>getItem(</code>)</strong></h3><p>Questo metodo recupera oggetti da localStorage. Ci sono altri metodi per farlo con React, ma useremo l'hook <code>useEffect()</code>, visto che è il modo migliore.</p><p><code>useEffect()</code> ci aiuta a recuperare tutti gli elementi alla prima presentazione, il che significa che quando il componente viene montato o ripresentato, estrae tutti i nostri dati da localStorage.</p><p>Nota che questa è la ragione per la quale abbiamo passato un array vuoto come secondo argomento di useEffect().</p><pre><code class="language-react">const [items, setItems] = useState([]);

useEffect(() =&gt; {
  const items = JSON.parse(localStorage.getItem('items'));
  if (items) {
   setItems(items);
  }
}, []);</code></pre><p>È importante ricordare che prima di essere salvati, i dati sono stati convertiti in stringa JSON. Ne consegue che per utilizzarli dobbiamo convertirli nuovamente in oggetto JSON. Lo facciamo con il metodo <code>JSON.parse()</code> .</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/11/Screenshot-from-2022-11-02-14-49-17.png" class="kg-image" alt="s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645369611908_explaining+useeffect+local+storage2" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/11/Screenshot-from-2022-11-02-14-49-17.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2022/11/Screenshot-from-2022-11-02-14-49-17.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2022/11/Screenshot-from-2022-11-02-14-49-17.png 1497w" sizes="(min-width: 1200px) 1200px" width="1497" height="816" loading="lazy"><figcaption>Come lavorano gli hook con localStorage per ottenere un elemento</figcaption></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo abbiamo imparato come usare localStorage con gli hook di React, quando usarlo e quali hook usare.</p><p>Se vuoi vedere come funziona in pratica, <a href="https://github.com/olawanlejoel/Todo-App">qui</a> puoi ottenere il codice sorgente di una semplice applicazione per gestire un elenco di cose da fare che utilizza localStorage e questi hook.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ React Context per Principianti – La Guida Completa (2021) ]]>
                </title>
                <description>
                    <![CDATA[ Il contesto di React è uno strumento essenziale da conoscere per qualunque sviluppatore React. Ti consente di condividere facilmente lo stato nelle tue applicazioni. In questa guida completa, tratteremo cos'è il contesto di React, come usarlo, quando usarlo e quando non, e molto altro. Anche se non hai mai lavorato ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/react-context-per-principianti/</link>
                <guid isPermaLink="false">635d2f339e87da0634a768e4</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Wed, 09 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/10/react-context-for-beginners--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/react-context-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Context for Beginners – The Complete Guide (2021)</a>
      </p><p>Il contesto di React è uno strumento essenziale da conoscere per qualunque sviluppatore React. Ti consente di condividere facilmente lo stato nelle tue applicazioni.</p><p>In questa guida completa, tratteremo cos'è il contesto di React, come usarlo, quando usarlo e quando non, e molto altro.</p><p>Anche se non hai mai lavorato prima con il contesto di React, sei nel posto giusto. Imparerai tutto quello che ti serve sapere con semplici esempi passo dopo passo.</p><p>Iniziamo!</p><h2 id="sommario">Sommario</h2><ul><li><a href="#cosa-e-il-contesto-di-react">Cosa è il contesto di React?</a></li><li><a href="#quando-dovresti-usare-il-contesto-di-react">Quando dovresti usare il contesto di React?</a></li><li><a href="#quali-problemi-risolve-il-contesto-di-react">Quali problemi risolve il contesto di React?</a></li><li><a href="#come-uso-il-contesto-di-react">Come uso il contesto di React?</a></li><li><a href="#cosa-e-l-hook-usecontext">Cos'è l'hook useContext?</a></li><li><a href="#potrebbe-non-servirti-il-contesto">Potrebbe non servirti il contesto</a></li><li><a href="#il-contesto-di-react-sostituisce-redux">Il contesto di React sostituisce Redux?</a></li><li><a href="#avvertenze-sul-contesto-di-react">Avvertenze sul contesto di React</a></li></ul><!--kg-card-begin: markdown--><h2 id="anamecosaeilcontestodireactacosailcontestodireact"><a name="cosa-e-il-contesto-di-react"></a>Cosa è il contesto di React?</h2>
<!--kg-card-end: markdown--><p>Il contesto in React ci consente di passare e utilizzare dati in qualunque componente servano nella nostra app React senza usare le prop.</p><p><em>In altre parole, il contesto </em>in<em> React ci consente di condividere dati (lo stato) tra i nostri componenti più facilmente<em>.</em></em></p><h2 id="quando-dovresti-usare-il-contesto-di-react"><strong>Quando dovresti usare il contesto di React?</strong></h2><p>Il contesto di React è ottimo quando devi passare dati che possono essere usati in qualunque componente nella tua applicazione.</p><p><strong>Questi tipi di dato includono<strong>:</strong></strong></p><ul><li>Dati relativi a un tema (come la modalità chiara o scura)</li><li>Dati utente (l'utente attualmente autenticato)</li><li>Dati specifici di posizione (come la lingua dell'utente o le impostazioni locali)</li></ul><p>I dati che dovrebbero essere inseriti nel contesto di React non dovrebbero essere dati che devono essere aggiornati frequentemente.</p><p>Questo perché il contesto non è stato concepito come un intero sistema di gestione dello stato. È stato creato per utilizzare dati più facilmente.</p><p><em>Puoi pensare al contesto di React come l'equivalente di variabili globali per i componenti React<em>.</em></em></p><h2 id="quali-problemi-risolve-il-contesto-di-react"><strong>Quali problemi risolve il contesto di React?</strong></h2><p>Il contesto di React ci consente di evitare un problema noto come "prop drilling".</p><p><strong><strong>Prop drilling</strong></strong> descrive una situazione nella quale i dati vengono passati come prop attraverso più livelli di componenti annidati, che non ne hanno bisogno, fino a raggiungere il componente che ne deve fare effettivamente uso.</p><p>Ecco un esempio di prop drilling. In questa applicazione abbiamo accesso ai dati di un tema che vogliamo passare come prop a tutti i componenti della nostra applicazione.</p><p>Come puoi vedere, anche i diretti discendenti di <code>App</code>, come <code>Header</code>, devono passare i dati del tema ai propri discendenti usando le prop.</p><pre><code class="language-js">export default function App({ theme }) {
  return (
    &lt;&gt;
      &lt;Header theme={theme} /&gt;
      &lt;Main theme={theme} /&gt;
      &lt;Sidebar theme={theme} /&gt;
      &lt;Footer theme={theme} /&gt;
    &lt;/&gt;
  );
}

function Header({ theme }) {
  return (
    &lt;&gt;
      &lt;User theme={theme} /&gt;
      &lt;Login theme={theme} /&gt;
      &lt;Menu theme={theme} /&gt;
    &lt;/&gt;
  );
}</code></pre><p>Qual è il problema con questo esempio<em><em>?</em></em></p><p>Il problema è che stiamo passando la prop <code>theme</code> attraverso componenti multipli, ai quali non serve direttamente.</p><p>Il componente <code>Header</code> non ha bisogno di <code>theme</code>, se non per passarlo ai suoi discendenti. In altre parole, sarebbe meglio che <code>User</code>, <code>Login</code> e <code>Menu</code> utilizzassero i dati in <code>theme</code> direttamente.</p><p>Questo è il vantaggio del contesto di React, possiamo evitare interamente l'uso delle prop, di conseguenza evitando il problema del prop drilling.</p><h2 id="come-uso-il-contesto-di-react">Come uso il contesto di React?</h2><p>Il contesto è una API integrata in React, a partire dalla versione 16.</p><p>Ciò significa che possiamo creare e utilizzare il contesto direttamente importando React in qualunque progetto React.</p><p><strong>Ci sono quattro passaggi per usare il contesto di React<strong>:</strong></strong></p><ol><li>Crea il contesto usando il metodo <code>createContext</code>.</li><li>Prendi il contesto che hai creato e racchiudi all'interno del fornitore di contesto (context provider) la tua alberatura di componenti .</li><li>Inserisci qualunque valore desideri nel tuo fornitore di contesto usando la prop <code>value</code>.</li><li>Utilizza quel valore all'interno di qualsiasi componente usando l'utilizzatore di contesto &nbsp;(context consumer).</li></ol><p><em>Tutto ciò può sembrare confuso</em>, ma è più semplice di quanto pensi.</p><p>Diamo un'occhiata a un esempio molto semplice. Dal componente <code>App</code> passiamo il nostro nome tramite contesto e lo leggiamo in un componente annidato: <code>User</code>.</p><pre><code class="language-js">import React from 'react';

export const UserContext = React.createContext();

export default function App() {
  return (
    &lt;UserContext.Provider value="Reed"&gt;
      &lt;User /&gt;
    &lt;/UserContext.Provider&gt;
  )
}

function User() {
  return (
    &lt;UserContext.Consumer&gt;
      {value =&gt; &lt;h1&gt;{value}&lt;/h1&gt;} 
      {/* stampa: Reed */}
    &lt;/UserContext.Consumer&gt;
  )
}</code></pre><p>Analizziamo passo dopo passo quello che stiamo facendo:</p><ol><li>Al di sopra del componente <code>App</code> creiamo il contesto con <code>React.createContext()</code> e lo assegniamo a una variabile, <code>UserContext</code>. In quasi tutti i casi, vorrai esportarlo nel modo in cui lo stiamo facendo qui, in quanto i tuoi componenti si troveranno in un altro file. Nota che possiamo passare un valore iniziale alla prop <code>value</code> quando chiamiamo <code>React.createContext()</code>.</li><li>Nel componente <code>App</code> usiamo <code>UserContext</code>. In particolare <code>UserContext.Provider</code>. Il contesto creato è un oggetto con due proprietà: <code>Provider</code> (fornitore) e <code>Consumer</code> (consumatore), entrambi i quali sono componenti. Per passare il nostro valore a ogni componente nella nostra app, dobbiamo racchiudere all'interno del componente Provider il componente (o i componenti) che deve utilizzare il contesto (in questo caso <code>User</code>).</li><li>In <code>UserContext.Provider</code>, inseriamo il valore che vogliamo passare a tutta la nostra alberatura di componenti. Per farlo lo assegniamo alla prop <code>value</code>. In questo caso il nostro nome (il mio è Reed).</li><li>In <code>User</code>, o qualunque componente che vogliamo utilizzi quello che viene fornito nel nostro contesto, utilizziamo il componente <code>UserContext.Consumer</code>. Per passare il valore usiamo quello che è noto come <strong>modello di presentazione delle prop (<strong><strong>render props pattern</strong></strong></strong>). È semplicemente una funzione che il componente consumer ci fornisce come prop. Come valore di ritorno di quella funzione, possiamo restituire e usare <code>value</code>.</li></ol><!--kg-card-begin: markdown--><h2 id="anamecosaelhookusecontextacoslhookusecontext"><a name="cosa-e-l-hook-usecontext"></a>Cos'è l'hook useContext?</h2>
<!--kg-card-end: markdown--><p>Se esaminiamo l'esempio qui sopra, il modello di presentazione delle prop per l'utilizzo del contesto ti potrebbe sembrare un po' strano.</p><p>Un altro modo di utilizzare il contesto è disponibile in React dalla versione 16.8 con l'arrivo degli hook di React. Ora possiamo usare il contesto con l'<strong>hook useContext</strong> .</p><p>Invece di usare il modello di presentazione delle prop possiamo passare l'intero oggetto contesto a <code>React.useContext()</code> per utilizzarlo all'inizio del nostro componente.</p><p>Ecco l'esempio di cui sopra usando l'hook useContext:</p><pre><code class="language-js">import React from 'react';

export const UserContext = React.createContext();

export default function App() {
  return (
    &lt;UserContext.Provider value="Reed"&gt;
      &lt;User /&gt;
    &lt;/UserContext.Provider&gt;
  )
}

function User() {
  const value = React.useContext(UserContext);  
    
  return &lt;h1&gt;{value}&lt;/h1&gt;;
}</code></pre><p><em>Il vantaggio dell'hook useContext è che rende il nostro componente più conciso e ci consente di creare i nostri hook personalizzati<em>.</em></em></p><p>Puoi usare il componente consumer direttamente oppure usare l'hook useContext, a seconda del modello che preferisci.</p><h2 id="potrebbe-non-servirti-il-contesto">Potrebbe non servirti il contesto</h2><p>L'errore che molti sviluppatori commettono è usare il contesto quando devono solo passare prop attraverso diversi livelli per raggiungere un componente.</p><p>Ecco un'applicazione con un componente <code>Avatar</code> annidato a cui servono due prop, <code>username</code> e <code>avatarSrc</code> dal componente <code>App</code> .</p><pre><code class="language-js">export default function App({ user }) {
  const { username, avatarSrc } = user;

  return (
    &lt;main&gt;
      &lt;Navbar username={username} avatarSrc={avatarSrc} /&gt;
    &lt;/main&gt;
  );
}

function Navbar({ username, avatarSrc }) {
  return (
    &lt;nav&gt;
      &lt;Avatar username={username} avatarSrc={avatarSrc} /&gt;
    &lt;/nav&gt;
  );
}

function Avatar({ username, avatarSrc }) {
  return &lt;img src={avatarSrc} alt={username} /&gt;;
}
</code></pre><p>Se possibile, vorremmo evitare di passare prop multiple attraverso componenti a cui non servono.</p><p><em>Come possiamo fare?</em></p><p>Invece di ripiegare immediatamente sul contesto, in quanto stiamo facendo prop drilling, dovremmo costruire meglio i nostri componenti.</p><p>Visto che solo il componente di livello più alto, <code>App</code>, deve sapere che esiste un componente <code>Avatar</code>, possiamo crearlo direttamente all'interno di <code>App</code>.</p><p>Questo ci consente di passare una singola prop, <code>avatar</code>, invece di due.</p><pre><code class="language-js">export default function App({ user }) {
  const { username, avatarSrc } = user;

  const avatar = &lt;img src={avatarSrc} alt={username} /&gt;;

  return (
    &lt;main&gt;
      &lt;Navbar avatar={avatar} /&gt;
    &lt;/main&gt;
  );
}

function Navbar({ avatar }) {
  return &lt;nav&gt;{avatar}&lt;/nav&gt;;
}</code></pre><p><em>In breve: non considerare subito il contesto. Vedi se puoi organizzare meglio i tuoi componenti per evitare il <em>prop drilling.</em></em></p><h2 id="il-contesto-di-react-sostituisce-redux">Il contesto di React sostituisce Redux?</h2><p>Sì e no.</p><p>Per molti principianti di React, Redux è un modo per passare dati molto più facilmente. Questo perché Redux stesso è dotato di un contesto React.</p><p>Tuttavia, se non stai anche <em>aggiornando</em> lo stato, ma passi semplicemente i dati attraverso la tua alberatura di componenti, non ti serve una libreria di gestione dello stato come Redux.</p><h2 id="avvertenze-sul-contesto-di-react">Avvertenze sul contesto di React</h2><p><em>Come mai non è possibile aggiornare il valore che il contesto di React mette a disposizione<em>?</em></em></p><p>Sebbene sia possibile combinare il contesto di React con un hook come useReducer e creare una libreria di gestione dello stato improvvisata senza ricorrere a librerie di terze parti, in genere non è consigliato per ragioni di prestazione.</p><p>Il problema con questo approccio è dato dal fatto che il contesto di React fa scattare una ripresentazione (re-rendering) dei componente.</p><p>Se stai passando un oggetto sul tuo fornitore di contesto React e una qualunque proprietà in esso si aggiorna, cosa succede? <em>Qualsiasi componente che utilizzi quel contesto verrà ripresentato<em>.</em></em></p><p>Questo potrebbe non costituire un problema di prestazioni in piccole applicazioni con pochi valori di stato che non sono aggiornati molto spesso (tipo i dati di un tema). Il problema sorge se esegui molti aggiornamenti di stato in un'applicazione con molti componenti nella tua alberatura.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Spero che questa guida ti abbia dato una migliore comprensione di come utilizzare il contesto di React in ogni suo aspetto.</p><p>Se approfondire ulteriormente l'utilizzo del contesto di React per creare fantastici progetti React, dai un'occhiata a <a href="https://reactbootcamp.com/">The React Bootcamp</a> (risorsa in inglese).</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Caricare Immagini in React con il Lazy Loading ]]>
                </title>
                <description>
                    <![CDATA[ Ottimizzare le risorse che utilizzi sui tuoi siti web – come il caricamento lazy delle immagini – è uno dei modi più efficaci per migliorare le prestazioni web. Facendo ciò ti assicuri che i tuoi siti siano veloci, che abbiano un'ottima SEO [https://it.wikipedia.org/wiki/Ottimizzazione_per_i_motori_di_ricerca] [https://en.wikipedia.org/wiki/Search_engine_optimization] e aiuti a migliorare l'esperienza utente. ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-caricare-immagini-in-react-con-il-lazy-loading/</link>
                <guid isPermaLink="false">63529b54fd2ade0620929899</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Mon, 31 Oct 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/10/How-to-lazy-load-images-in-React-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-lazy-load-images-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Lazy Load Images in React</a>
      </p><p>Ottimizzare le risorse che utilizzi sui tuoi siti web – come il caricamento lazy delle immagini – è uno dei modi più efficaci per migliorare le prestazioni web.</p><p>Facendo ciò ti assicuri che i tuoi siti siano veloci, che abbiano un'ottima <a href="https://en.wikipedia.org/wiki/Search_engine_optimization"></a><a href="https://it.wikipedia.org/wiki/Ottimizzazione_per_i_motori_di_ricerca">SEO</a> e aiuti a migliorare l'esperienza utente.</p><p>In quest'articolo, imparerai come caricare immagini tramite lazy loading in una applicazione React. Parleremo di quali sono i vantaggi e di come implementarlo nel tuo codice.</p><p>Ma prima di iniziare, cosa vuol dire lazy loading e come funziona?</p><h2 id="cos-il-lazy-loading"><strong>Così il Lazy Loading?</strong></h2><blockquote><em>Il l<em>azy loading </em>è una strategia che ritarda il caricamento di alcune risorse (ad esempio immagini) fino a che non sono necessarie all'utente in base alla sua attività e al pattern di navigazione<em>. </em>Tipicamente, queste risorse vengono caricate soltanto quando lo scorrimento le porta nella vista della pagina<em>. </em>(<a href="https://developer.mozilla.org/en-US/docs/Glossary/Lazy_load"></a><a href="https://developer.mozilla.org/en-US/docs/Glossary/Lazy_load">F</a>onte<em><a href="https://developer.mozilla.org/en-US/docs/Glossary/Lazy_load">: MDN Docs</a></em>)</em></blockquote><p>Puoi vederne un eccellente esempio su <a href="http://unsplash.com/">Unsplash</a> quando scorriamo lungo la lista delle immagini. Inizialmente, vediamo delle immagini segnaposto di bassa qualità (<a href="https://web.dev/image-component/">LQIP</a>) sfocate e poi, quando scorrono nella vista della pagina, le intere immagini vengono caricate.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/unsplash-lazy-load-image-illustration-.gif" class="kg-image" alt="unsplash-lazy-load-image-illustration-" width="600" height="400" loading="lazy"></figure><p>L'idea alla base di questo processo è di rimandare il caricamento delle immagini fuori dal viewport per ridurre l'utilizzo di banda, migliorare l'esperienza utente e velocizzare il caricamento della pagina.</p><p>Oggi usare il lazy loading per un'immagine o un iframe è facile quanto aggiungere l'attributo <code>loading="lazy"</code> all'interno dell'elemento <code>img</code>/<code>iframe</code>, in questo modo:</p><pre><code class="language-html">&lt;img src="image.jpg" alt="Image Alt" loading="lazy" /&gt;
&lt;iframe src="iframe" loading="lazy"&gt;&lt;/iframe&gt;
</code></pre><p>E funziona senza ulteriori configurazioni.</p><p>Sfortunatamente, secondo <a href="https://caniuse.com/?search=lazyloading">caniuse.com</a>, il caricamento lazy delle immagini in questo modo non è supportato da tutti i browser. Inoltre, per browser come Firefox, l'attributo <code>loading= "lazy"</code> non funziona per l'elemento <code>iframe</code>. In questi casi, dovrai usarlo/combinarlo con altre librerie o strumenti.</p><h2 id="come-iniziare-con-lazy-loading"><strong>Come iniziare con Lazy Loading</strong></h2><p>In questo articolo, utilizzerò una libreria JavaScript <a href="https://www.npmjs.com/package/react-lazy-load-image-component">React Lazy Load Image Component</a>.<br>Questa popolare libreria fornisce le funzionalità per presentare immagini e degli effetti che puoi implementare in modo facile e veloce nelle tue applicazioni React.</p><p>Il codice di questa demo è disponibile su <a href="https://github.com/evavic44/react-lazyload">GitHub qui</a>.</p><h3 id="step-1-installa-react-lazy-load-image-component"><strong>Step 1 – Installa React Lazy Load Image Component</strong></h3><p>La prima cosa di cui abbiamo bisogno è installare la libreria React lazy load image component usando NPM:</p><pre><code class="language-js">// Yarn
$ yarn add react-lazy-load-image-component

//o NPM
$ npm i --save react-lazy-load-image-component
</code></pre><h3 id="step-2-importa-il-componente"><strong>Step 2 – Importa il componente</strong></h3><p>Importeremo soltanto la nostra immagine e il componente lazy load, ma puoi usare un URL esterno se preferisci. Nel mio caso, lo sto importando come un componente dalla cartella immagini.</p><pre><code class="language-js">import Image from "../images/bird.jpg";
import { LazyLoadImage } from "react-lazy-load-image-component";
</code></pre><h3 id="step-3-dichiarare-l-immagine"><strong>Step 3 – Dichiarare l'immagine</strong></h3><p>Per iniziare a utilizzarlo, invece di dichiarare le immagini in un tag <code>img</code>, sostituisci questo tag con <code>LazyLoadImage</code> e dichiara l'immagine con un attributo <code>src</code> come faresti normalmente.</p><p>Ecco l'aspetto che ha il codice:</p><pre><code class="language-js">import React from "react";
import Image from "../images/bird.jpg";
import { LazyLoadImage } from "react-lazy-load-image-component";

export default function App() {
  return (
    &lt;div&gt;
      &lt;LazyLoadImage src={Image}
        width={600} height={400}
        alt="Image Alt"
      /&gt;
     &lt;/div&gt;
  );
}
</code></pre><p>Abbiamo definito esplicitamente la larghezza e l'altezza dell'immagine. Questo aiuta a evitare problemi come il <a href="https://web.dev/cls/">cumulative layout shift (CLS)</a>.</p><p>Per vedere gli effetti del componente, vai sulla scheda "Rete" dopo aver aperto gli strumenti per sviluppatori usando Ctrl + Shift + J su Windows, o Cmd + Opt + J su Mac. Poi imposta la limitazione su una rete più lenta (3G), disabilita la cache e ricarica la pagina.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/network-tab.png" class="kg-image" alt="network-tab" width="600" height="400" loading="lazy"></figure><p>Ecco il risultato:</p><p></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/default.gif" class="kg-image" alt="default" width="600" height="400" loading="lazy"></figure><p>Di default, puoi vedere che l'immagine non si carica sulla schermo perché non è visibile nel viewport. Una volta che inizi a scorrere e l'immagine è nella vista, lazy load viene disabilitato e possiamo vedere l'immagine.</p><p><a href="https://react-lazyload.vercel.app/default">Live Demo</a></p><h3 id="step-4-aggiungi-un-immagine-segnaposto"><strong>Step 4 – Aggiungi un'immagine segnaposto</strong></h3><p>Alternativamente, possiamo aggiungere un'anteprima di un'immagine a bassa risoluzione mentre avviene il caricamento della pagina principale. Può essere utile per riempire l'area dell'immagine in modo che gli utenti sappiano che c'è una foto che si sta caricando. Ci riferiamo a questa immagine segnaposto come LQIP (low-quality image placeholder).</p><p>Fare ciò non migliora soltanto la pagina, ma dà anche all'utente un'idea dell'aspetto dell'immagine effettiva.</p><p>Per ottenere un'immagine di dimensione minore, mi piace usare <a href="https://squoosh.app/">squoosh.app</a>. Importa l'immagine e sperimenta con la risoluzione e la qualità finché non sei convinto della dimensione.</p><p>Altri strumenti per immagini che puoi usare sono:</p><ul><li><a href="https://www.adobe.com/products/photoshop.html">Photoshop</a></li><li><a href="https://responsivebreakpoints.com/">Responsive Breakpoints</a></li></ul><p></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/rasterized.png" class="kg-image" alt="rasterized-image" width="600" height="400" loading="lazy"></figure><p>Inizialmente, l'immagine era di <code>288KB</code>, ma l'abbiamo compressa con successo fino a una versione a bassa risoluzione di <code>2.41KB</code>. Per usare un'immagine segnaposto, aggiungi all'immagine un attributo <code>PlaceholderSrc</code> con l'immagine come valore.</p><pre><code class="language-js">import Image from "../images/bird.jpg";
import PlaceholderImage from "../images/placeholder.jpg";

&lt;LazyLoadImage src={Image}
    width={600} height={400}
    PlaceholderSrc={PlaceholderImage}
    alt="Image Alt"
/&gt;
</code></pre><p><br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/React-lazyload---LQIP-.gif" class="kg-image" alt="React-lazyload-LQIP-" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, inizialmente avviene il caricamento dell'immagine segnaposto e, una volta terminato, viene rimpiazzata dell'immagine principale.</p><p><a href="https://react-lazyload.vercel.app/placeholder">Live Demo</a></p><h3 id="step-5-aggiungere-una-sfocatura"><strong>Step 5 – Aggiungere una sfocatura</strong></h3><p>LazyLoadImage fornisce anche un plugin per presentare inizialmente un'immagine sfocata per poi rimuovere la sfocatura a caricamento completato.</p><p>In combinazione con l'immagine segnaposto, renderà più bello l'aspetto complessivo, offrendo un output migliore.</p><p>Per utilizzare la sfocatura (blur), dobbiamo importare il file CSS che la governa:</p><pre><code class="language-js">import Image from "../images/bird.jpg";
import PlaceholderImage from "../images/placeholder.jpg";
import { LazyLoadImage } from 'react-lazy-load-image-component';
import 'react-lazy-load-image-component/src/effects/blur.css';

&lt;LazyLoadImage src={Image}
    width={600} height={400}
    PlaceholderSrc={PlaceholderImage}
    effect="blur"
/&gt;
</code></pre><p><br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/React-lazyload---Blur.gif" class="kg-image" alt="React-lazyload---Blur" width="600" height="400" loading="lazy"></figure><p><a href="https://react-lazyload.vercel.app/blur">Live Demo</a></p><h2 id="perch-dovresti-usare-lazy-load-per-le-tue-immagini"><strong>Perché dovresti usare Lazy Load per le tue immagini?</strong></h2><p>Potresti chiederti perché dovresti affrontare tutti i problemi del caricare le immagini fuori schermata nelle tua applicazioni web con lazy load. Ne vale la pena? E perché dovresti interessarti dei punti condivisi in questo articolo?</p><p>Ecco una lista di ragioni:</p><h3 id="1-lazy-loading-risparmia-dati-e-banda"><strong>1. Lazy Loading risparmia dati e banda</strong></h3><p>Dato che le immagini fuori dal viewport non sono caricate immediatamente, il lazy loading risparmia l'utilizzo della banda. È favorevole alle prestazioni, soprattutto per gli utenti mobile.</p><h3 id="2-lazy-loading-abbassa-il-costo-di-un-cdn"><strong>2. Lazy Loading abbassa il costo di un CDN</strong></h3><p>I servizi di contenuti multimediali come <a href="https://cloudinary.com/">Cloudinary</a> o <a href="https://www.freecodecamp.org/news/how-to-lazy-load-images-in-react/imagekit.io">Imagekit</a> offrono dei piani a pagamento per l'archiviazione multimediale. Caricare le immagini con lazy loading ti assicura che solo le immagini richieste dal CDN siano caricate, riducendo i costi del server.</p><h3 id="3-lazy-loading-migliora-la-seo"><strong>3. Lazy Loading migliora la SEO</strong></h3><p>La velocità di una pagina è un fattore critico che influenza la SEO (e rende più probabile che i motori di ricerca suggeriscano la tua pagina). Se il tempo di caricamento della tua pagina è molto basso, i motori di ricerca ameranno il tuo sito.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Ottimizzare le immagini è una buona capacità che credo ogni sviluppatore web debba coltivare. Crea un'esperienza migliore per gli utenti, soprattutto quelli su dispositivi mobili.</p><p>Ecco <a href="https://github.com/Evavic44/react-lazyload">il file del codice di questo articolo su </a><a href="https://github.com/Evavic44/react-lazyload">GitHub</a>.</p><p>Per ora è tutto, grazie per aver letto questo articolo!</p><p>Seguimi su twitter <a href="https://twitter.com/victorekea">@victorekea</a>.</p><h2 id="risorse"><strong>Risorse</strong></h2><ul><li><a href="https://www.npmjs.com/package/react-lazy-load-image-component">React Lazy Load Image Component</a></li><li><a href="https://react-lazyload.vercel.app/">Demo</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial React Router – Come Utilizzare i Componenti Redirect, Switch, Link e Molto Altro, con Esempi di Codice ]]>
                </title>
                <description>
                    <![CDATA[ Se hai appena iniziato con React, probabilmente ti stai arrovellando sul concetto di Applicazione a Pagina Singola (Single Page Application). Tradizionalmente l'instradamento funziona in questo modo: supponiamo che digiti  /contact come URL. Il browser eseguirà una richiesta GET al server, il quale restituirà una pagina HTML come risposta. Tuttavia ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/tutorial-react-router-come-utilizzare-i-componenti-redirect-switch-link-e-molto-altro-con-esempi-di-codice/</link>
                <guid isPermaLink="false">633be09e271b000641be41da</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Thu, 13 Oct 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/10/5f9c9ad1740569d1a4ca27f2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/react-router-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Router Tutorial – How to Render, Redirect, Switch, Link, and More, With Code Examples</a>
      </p><p>Se hai appena iniziato con React, probabilmente ti stai arrovellando sul concetto di Applicazione a Pagina Singola (Single Page Application).</p><p>Tradizionalmente l'instradamento funziona in questo modo: supponiamo che digiti <code>/contact</code> come URL. Il browser eseguirà una richiesta GET al server, il quale restituirà una pagina HTML come risposta.</p><p>Tuttavia con il paradigma della Applicazione a Pagina Singola, tutte le richieste via URL sono servite usando il codice lato client.</p><p>Applicando questo nel contesto di React, ciascuna pagina sarà un componente React. React-Router cerca una corrispondenza con l'URL e carica il componente per quella particolare pagina.</p><p>Tutto accade così velocemente e perfettamente, che l'utente ottiene nel browser la stessa esperienza che avrebbe utilizzando una app nativa. Non ci sono pagine vuote lampeggianti durante la transizione tra le rotte.</p><p>In questo articolo, imparerai coma usare React-Router e i suoi componenti per creare una Applicazione a Pagina Singola. Quindi apri il tuo editor preferito e iniziamo.</p><h2 id="impostare-il-progetto"><strong>Impostare il Progetto</strong></h2><p>Crea un nuovo progetto React eseguendo il seguente comando.</p><pre><code class="language-sh">yarn create react-app react-router-demo</code></pre><p>Userò yarn per l'installazione delle dipendenze ma puoi usare anche npm.</p><p>Ora installiamo <code>react-router-dom</code>.</p><pre><code>yarn add react-router-dom</code></pre><p>Per lo stile dei componenti userò il framework CSS Bulma, quindi aggiungiamolo.</p><pre><code>yarn add bulma</code></pre><p>Successivamente, importa <code>bulma.min.css</code> nel file <code>index.js</code> ed elimina tutto il codice boilerplate dal file <code>App.js</code>.</p><pre><code class="language-js">import "bulma/css/bulma.min.css";</code></pre><p>Ora che hai il progetto impostato iniziamo a creare alcuni componenti per rappresentare le pagine.</p><h2 id="creare-i-componenti-di-pagina"><strong><strong>Crea</strong>re i Componenti di Pagina</strong></h2><p>Crea una directory <code>pages</code> all'interno della cartella <code>src</code>, dove verranno inseriti tutti i componenti di pagina.</p><p>Per questa dimostrazione, crea tre pagine - Home, About, e Profile.</p><p>Incolla il seguente codice all'interno dei componenti Home e About.</p><pre><code class="language-jsx">// pages/Home.js

import React from "react";

const Home = () =&gt; (
  &lt;div&gt;
    &lt;h1 className="title is-1"&gt;This is the Home Page&lt;/h1&gt;
    &lt;p&gt;
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras gravida,
      risus at dapibus aliquet, elit quam scelerisque tortor, nec accumsan eros
      nulla interdum justo. Pellentesque dignissim, sapien et congue rutrum,
      lorem tortor dapibus turpis, sit amet vestibulum eros mi et odio.
    &lt;/p&gt;
  &lt;/div&gt;
);

export default Home;
</code></pre><pre><code class="language-jsx">// pages/About.js

import React from "react";

const About = () =&gt; (
  &lt;div&gt;
    &lt;h1 className="title is-1"&gt;This is the About Page&lt;/h1&gt;
    &lt;p&gt;
      Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
      inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus
      et ultrices posuere cubilia curae; Duis consequat nulla ac ex consequat,
      in efficitur arcu congue. Nam fermentum commodo egestas.
    &lt;/p&gt;
  &lt;/div&gt;
);

export default About;
</code></pre><p>Creeremo la pagina Profile successivamente.</p><h2 id="creare-il-componente-navbar"><strong><strong>Crea</strong>re il Componente <strong>Navbar</strong></strong></h2><p>Iniziamo creando la barra di navigazione per l'app, la quale utilizzerà il componente <code>&lt;NavLink /&gt;</code> di <code>react-router-dom</code>.<br><br>Crea una directory chiamata <code>components</code> all'interno della cartella <code>src</code>.</p><pre><code class="language-jsx">// components/Navbar.js

import React, { useState } from "react";
import { NavLink } from "react-router-dom";

const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return ( 
  	&lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
      	{/* ... */}
      &lt;/div&gt;
    &lt;/nav&gt;
  );
 };
 
 export default Navbar;</code></pre><p>La variabile di stato <code>isOpen</code> sarà usata per attivare il menu su dispositivi mobili o tablet.</p><p>Aggiungiamo quindi il menu "hamburger".</p><pre><code class="language-jsx">const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return ( 
  	&lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
      &lt;div className="navbar-brand"&gt;
          &lt;a
            role="button"
            className={`navbar-burger burger ${isOpen &amp;&amp; "is-active"}`}
            aria-label="menu"
            aria-expanded="false"
            onClick={() =&gt; setOpen(!isOpen)}
          &gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      	{/* ... */}
      &lt;/div&gt;
    &lt;/nav&gt;
  );
 };</code></pre><p>Per aggiungere il link al menu utilizza il componente <code>&lt;NavLink /&gt;</code> di <code>react-router-dom</code>. </p><p>Il componente <code>NavLink</code> fornisce un modo dichiarativo per navigare nell'applicazione. È simile al componente <code>Link</code>, tranne per il fatto che è possibile applicare uno stile che lo evidenzia se il link è attivo.</p><p>Per specificare verso quale rotta navigare, usa la proprietà <code>to</code> assegnandole come valore il nome del percorso.<br>Nel caso il link sia attualmente attivo, la proprietà <code>activeClassName</code> aggiungerà una classe per evidenziarlo.</p><pre><code class="language-jsx">&lt;NavLink
    className="navbar-item"
    activeClassName="is-active"
    to="/"
    exact
&gt;
	Home
&lt;/NavLink&gt;</code></pre><p>Nel browser, il componente <code>NavLink</code> viene presentato come un tag <code>&lt;a&gt;</code> con un valore dell'attributo <code>href</code> corrispondente a quello che è stato passato alla proprietà <code>to</code> .</p><p>Inoltre occorre specificare qui la proprietà <code>exact</code> in modo che corrisponda precisamente con l'URL.</p><p>Aggiungi tutti i link e termina il componente <code>Navbar</code>.</p><pre><code class="language-jsx">import React, { useState } from "react";
import { NavLink } from "react-router-dom";

const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return (
    &lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
        &lt;div className="navbar-brand"&gt;
          &lt;a
            role="button"
            className={`navbar-burger burger ${isOpen &amp;&amp; "is-active"}`}
            aria-label="menu"
            aria-expanded="false"
            onClick={() =&gt; setOpen(!isOpen)}
          &gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
          &lt;/a&gt;
        &lt;/div&gt;

        &lt;div className={`navbar-menu ${isOpen &amp;&amp; "is-active"}`}&gt;
          &lt;div className="navbar-start"&gt;
            &lt;NavLink className="navbar-item" activeClassName="is-active" to="/"&gt;
              Home
            &lt;/NavLink&gt;

            &lt;NavLink
              className="navbar-item"
              activeClassName="is-active"
              to="/about"
            &gt;
              About
            &lt;/NavLink&gt;

            &lt;NavLink
              className="navbar-item"
              activeClassName="is-active"
              to="/profile"
            &gt;
              Profile
            &lt;/NavLink&gt;
          &lt;/div&gt;

          &lt;div className="navbar-end"&gt;
            &lt;div className="navbar-item"&gt;
              &lt;div className="buttons"&gt;
                &lt;a className="button is-white"&gt;Log in&lt;/a&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/nav&gt;
  );
};

export default Navbar;
</code></pre><p>Se hai notato, qui ho aggiunto un bottone Login. Torneremo sul componente <code>Navbar</code> quando discuteremo le rotte protette successivamente in questo articolo.</p><h2 id="presentare-le-pagine"><strong>Presentare le Pagine</strong></h2><p>Ora che il componente <code>Navbar</code> è stato impostato aggiungiamolo alla pagina e iniziamo a presentare le pagine.</p><p>Visto che la barra di navigazione è un componente comune a tutte le pagine, invece di chiamare il componente in ciascuna di esse, sarà un approccio migliore presentare <code>Navbar</code> secondo un layout comune a tutte le pagine.</p><pre><code class="language-jsx">// App.js

function App() {
  return (
    &lt;&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        {/* Render the page here */}
      &lt;/div&gt;
    &lt;/&gt;
  );
}</code></pre><p>Ora aggiungi i componenti di pagina all'interno del contenitore.</p><pre><code class="language-jsx">// App.js

function App() {
  return (
    &lt;&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        &lt;Home /&gt;
      	&lt;About /&gt;
      &lt;/div&gt;
    &lt;/&gt;
  );
}</code></pre><p>Se controlli il risultato adesso, noterai che i componenti di pagina Home e About sono presentati entrambi all'interno della pagina. Questo perché non abbiamo ancora aggiunto alcuna logica di instradamento.</p><p>Per aggiungere la capacità di navigare tra i componenti devi importare il componente di React Router <code>BrowserRouter</code>. Tutto quello che devi fare è racchiudere tutti i componenti di pagina all'interno del componente <code>BrowserRouter</code>. Questo consentirà a tutti i componenti di pagina di avere una logica di instradamento. Perfetto!</p><p>Ma ancora una volta, nulla cambia per quanto riguarda il risultato – vedrai ancora entrambe le pagine presentate. Dovrai presentare il componente di pagina solo se l'URL corrisponde a un particolare percorso. È qui che entra in gioco il componente di React Router <code>Route</code>.</p><p>Il componente <code>Route</code> ha una proprietà <code>path</code> che accetta il percorso della pagina e il componente di pagina dovrebbe essere inserito all'interno di <code>Route</code>, come mostrato qui sotto.</p><pre><code class="language-jsx">&lt;Route path="/about"&gt;
  &lt;About /&gt;
&lt;/Route&gt;</code></pre><p>Facciamo lo stesso per il componente <code>Home</code> .</p><pre><code class="language-jsx">&lt;Route exact path="/"&gt;
  &lt;Home /&gt;
&lt;/Route&gt;</code></pre><p>La proprietà <code>exact</code> qui sopra dice al componente <code>Route</code> di cercare corrispondenza esatta per il percorso. Senza aggiungere la proprietà <code>exact</code> al percorso <code>/</code>, ci sarebbe corrispondenza con tutte le rotte che iniziano con <code>/</code> compreso <code>/about</code>.</p><p>Se adesso verifichi i risultati, vedrai ancora presentati entrambi i componenti, ma se vai su <code>/about</code>, noterai che solo il componente <code>About</code> viene presentato. Questo comportamento si verifica in quanto il router continua a cercare corrispondenza dell'URL con le rotte anche dopo che ne ha già trovata una.</p><p>Dobbiamo dire al router di interrompere la ricerca di corrispondenza una volta che ha trovato una rotta che corrisponde. Questo si ottiene usando il componente <code>Switch</code> di React Router.</p><pre><code class="language-jsx">function App() {
  return (
    &lt;BrowserRouter&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        &lt;Switch&gt;
          &lt;Route exact path="/"&gt;
            &lt;Home /&gt;
          &lt;/Route&gt;
          &lt;Route path="/about"&gt;
            &lt;About /&gt;
          &lt;/Route&gt;
        &lt;/Switch&gt;
      &lt;/div&gt;
    &lt;/BrowserRouter&gt;
  );
}</code></pre><p>Ed ecco fatto! Hai configurato con successo l'instradamento nella tua app React.</p><h2 id="rotte-protette-e-redirezione"><strong>Rotte Protette e Redirezione</strong></h2><p>Lavorando su applicazioni per il mondo reale, ci saranno alcune rotte che sono dipendenti da un sistema di autenticazione. Avrai rotte o pagine che saranno accessibili solamente da un utente connesso. In questa sezione, imparerai come implementare queste rotte.</p><p><strong><em>Per favore nota</em></strong><em><em> </em>che non andrò a creare alcun form di accesso o un qualsiasi servizio back-end per autenticare l'utente. In una applicazione reale, non implementeresti l'autenticazione nel modo qui mostrato<em>.</em></em></p><p>Creiamo il componente di pagina Profile al quale dovrebbe avere accesso solo un utente autenticato.</p><pre><code class="language-jsx">// pages/Profile.js

import { useParams } from "react-router-dom";

const Profile = () =&gt; {
  const { name } = useParams();
  return (
    &lt;div&gt;
      &lt;h1 className="title is-1"&gt;This is the Profile Page&lt;/h1&gt;
      &lt;article className="message is-dark" style={{ marginTop: 40 }}&gt;
        &lt;div className="message-header"&gt;
          &lt;p&gt;{name}&lt;/p&gt;
        &lt;/div&gt;
        &lt;div className="message-body"&gt;
          Lorem ipsum dolor sit amet, consectetur adipiscing elit.{" "}
          &lt;strong&gt;Pellentesque risus mi&lt;/strong&gt;, tempus quis placerat ut, porta
          nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida
          purus diam, et dictum &lt;a&gt;felis venenatis&lt;/a&gt; efficitur. Aenean ac{" "}
          &lt;em&gt;eleifend lacus&lt;/em&gt;, in mollis lectus. Donec sodales, arcu et
          sollicitudin porttitor, tortor urna tempor ligula, id porttitor mi
          magna a neque. Donec dui urna, vehicula et sem eget, facilisis sodales
          sem.
        &lt;/div&gt;
      &lt;/article&gt;
    &lt;/div&gt;
  );
};
</code></pre><p>Utilizzando i parametri di rotta recupereremo dall'URL il nome utente.</p><p>Aggiungi la rotta Profile all'interno del router.</p><pre><code class="language-jsx">&lt;Route path="/profile/:name"&gt;
  &lt;Profile /&gt;
&lt;/Route&gt;</code></pre><p>Attualmente si può accedere direttamente alla pagina Profile. Facciamo in modo che sia una rotta autenticata creando un componente di livello più alto (Higher-Order component - HOC) per incapsulare la logica di autenticazione.</p><pre><code class="language-jsx">const withAuth = (Component) =&gt; {
  const AuthRoute = () =&gt; {
    const isAuth = !!localStorage.getItem("token");
    // ...
  };

  return AuthRoute;
};</code></pre><p>Per determinare se un utente sia o meno autenticato, recupera il token di autenticazione che è conservato nel browser quando l'utente si connette. Se l'utente non è autenticato, reindirizza l'utente alla pagina Home. Il componente di React Router <code>Redirect</code> può essere usato per reindirizzare l'utente verso un altro percorso.</p><pre><code class="language-jsx">const withAuth = (Component) =&gt; {
  const AuthRoute = () =&gt; {
    const isAuth = !!localStorage.getItem("token");
    if (isAuth) {
      return &lt;Component /&gt;;
    } else {
      return &lt;Redirect to="/" /&gt;;
    }
  };

  return AuthRoute;
};</code></pre><p>Puoi anche passare altre informazioni sull'utente come il nome e il suo ID passandole come proprietà verso il componente incapsulato.</p><p>Successivamente usa l'HOC <code>withAuth</code> nel componente Profile.</p><pre><code class="language-jsx">import withAuth from "../components/withAuth";

const Profile = () =&gt; {
 // ...
}

export default withAuth(Profile);</code></pre><p>Ora se provi a visitare <code>/profile/JohnDoe</code>, sarai reindirizzato alla pagina Home. Questo perché il token di autenticazione non è ancora stato impostato e conservato nel browser.</p><p>Bene, torniamo al componente <code>Navbar</code> e aggiungiamo le funzionalità di connessione e disconnessione. Quando l'utente è autenticato viene mostrato il pulsante Logout per disconnettersi e quando l'utente non è ancora connesso viene mostrato il pulsante Login per connettersi.</p><pre><code class="language-jsx">// components/Navbar.js

const Navbar = () =&gt; {
	// ...
    return (
    	&lt;nav
          className="navbar is-primary"
          role="navigation"
          aria-label="main navigation"
        &gt;
        &lt;div className="container"&gt;
        	{/* ... */}
            &lt;div className="navbar-end"&gt;
            &lt;div className="navbar-item"&gt;
              &lt;div className="buttons"&gt;
                {!isAuth ? (
                  &lt;button className="button is-white" onClick={loginUser}&gt;
                    Log in
                  &lt;/button&gt;
                ) : (
                  &lt;button className="button is-black" onClick={logoutUser}&gt;
                    Log out
                  &lt;/button&gt;
                )}
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;/nav&gt;
    );
}

</code></pre><p>Quando l'utente fa click sul pulsante Login, imposta un token fittizio nel localStorage e reindirizza l'utente alla pagina Profile.</p><p>In questo caso, tuttavia, non possiamo usare il componente <code>Redirect</code> – dobbiamo reindirizzare l'utente programmaticamente. Dato che il token per l'autenticazione costituisce un dato sensibile, in genere è conservato in un cookie per ragioni di sicurezza.</p><p>React Router ha un componente HOC <code>withRouter</code> che inserisce l'oggetto <code>history</code> nelle proprietà del componente per sfruttare l'API History. Passa anche al componente incapsulato le proprietà <code>match</code> e <code>location</code> aggiornate.</p><pre><code class="language-jsx">// components/Navbar.js

import { NavLink, withRouter } from "react-router-dom";

const Navbar = ({ history }) =&gt; { 
  const isAuth = !!localStorage.getItem("token");

  const loginUser = () =&gt; {
    localStorage.setItem("token", "some-login-token");
    history.push("/profile/Vijit");
  };

  const logoutUser = () =&gt; {
    localStorage.removeItem("token");
    history.push("/");
  };
  
  return ( 
   {/* ... */}
  );
};

export default withRouter(Navbar);</code></pre><p>E <em><em>voilà</em></em>! Questo è tutto. Hai conquistato anche la terra delle rotte autenticate.</p><p>Puoi trovare la dimostrazione live <a href="https://react-router-demo.vijitail.dev/">qui</a> e il codice completo in questo <a href="https://github.com/vijitail/react-router-demo">repository</a> come riferimento.</p><h2 id="conclusione"><strong><strong>Conclusion</strong>e</strong></h2><p>Spero che ormai ti sia fatto una buona idea di come funziona l'instradamento lato client in generale e come implementarlo in React usando la libreria React Router.</p><p>In questa guida, hai imparato a conoscere i componenti vitali di React Router quali <code>Route</code>, <code>withRouter</code>, <code>Link</code> e così via, assieme ad alcuni concetti avanzati come le rotte autenticate, che sono richieste per costruire un'applicazione.</p><p>Consulta la <a href="https://reacttraining.com/react-router/web/guides/quick-start">documentazione</a> di &nbsp;React Router per ottenere una panoramica più dettagliata di ciascuno dei componenti.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Creare una App React con un Back End Node: La Guida Completa ]]>
                </title>
                <description>
                    <![CDATA[ Un front end React collegato a un back end Node è una combinazione solida per realizzare qualsiasi applicazione. Questa guida è stata pensata per aiutarti a creare progetti full-stack con React nel modo più semplice possibile. Vediamo come impostare da zero un intero progetto con React e Node e come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-creare-una-app-react-con-un-backend-node-la-guida-completa/</link>
                <guid isPermaLink="false">632d6a41f289f3074339576f</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alessandro Cipriani ]]>
                </dc:creator>
                <pubDate>Tue, 04 Oct 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/how-to-build-a-react-app-with-a-node-backend-alt.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-create-a-react-app-with-a-node-backend-the-complete-guide/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create a React App with a Node Backend: The Complete Guide</a>
      </p><p>Un front end React collegato a un back end Node è una combinazione solida per realizzare qualsiasi applicazione.</p><p>Questa guida è stata pensata per aiutarti a creare progetti full-stack con React nel modo più semplice possibile.</p><p>Vediamo come impostare da zero un intero progetto con React e Node e come distribuirlo sul web.</p><h2 id="strumenti-necessari"><strong>Strumenti necessari</strong></h2><ol><li>Assicurati che Node e NPM siano installati sul tuo computer. Puoi scaricarli entrambi da <a href="https://nodejs.org/">nodejs.org</a> (NPM è incluso nell'installazione di Node)</li><li>Utilizza un editor di codice di tua scelta. Io sto usando e personalmente consiglio di usare VSCode. È possibile scaricare VSCode all'indirizzo <a href="https://code.visualstudio.com/">code.visualstudio.com</a>.</li><li>Assicurati di avere Git installato sul computer. Questo è necessario per distribuire la nostra applicazione con Heroku. È possibile ottenerlo all'indirizzo <a href="https://git-scm.com/">git-scm.com</a></li><li>Un account su <a href="https://heroku.com/">heroku.com</a>. Utilizzeremo Heroku per pubblicare la nostra applicazione sul web in modo completamente gratuito.</li></ol><p><em>Nota: dal 28 Novembre 2022 il servizio gratuito di Heroku non sarà più disponibile.</em></p><h2 id="passo-1-creare-il-back-end-node-express-">Passo 1: Creare il back end Node (Express)</h2><p>Per prima cosa, crea una cartella per il progetto chiamata <code>react-node-app</code> (per esempio).</p><p>Quindi, trascina la cartella nell'editor di codice.</p><p>Per creare il nostro progetto Node, esegui il seguente comando nel terminale:</p><pre><code class="language-bash">npm init -y</code></pre><p>Questo creerà un file package.json che ci permetterà di tenere traccia di tutti gli script dell'applicazione e di gestire le dipendenze di cui l'applicazione Node ha bisogno.</p><p>Il nostro codice server si troverà in una cartella con lo stesso nome: <code>server</code>. Creiamo questa cartella.</p><p>Al suo interno, collocheremo un singolo file, dal quale faremo partire il nostro server: <code>index.js</code>.</p><p>Utilizzeremo il framework Express per creare un semplice web server, che verrà eseguito sulla porta 3001 se non specificato alcun valore per la variabile d'ambiente <code>PORT</code> (Heroku imposterà questo valore quando distribuiremo la nostra applicazione).</p><pre><code class="language-js">// server/index.js

const express = require("express");

const PORT = process.env.PORT || 3001;

const app = express();

app.listen(PORT, () =&gt; {
  console.log(`Server listening on ${PORT}`);
});</code></pre><p>Successivamente, installeremo Express come dipendenza eseguendo nel nostro terminale:</p><pre><code class="language-bash">npm i express</code></pre><p>Dopodiché, creeremo uno script in package.json che avvierà il nostro server web quando eseguiremo il comando <code>npm start</code>:</p><pre><code class="language-json">// server/package.json

...
"scripts": {
  "start": "node server/index.js"
},
...</code></pre><p>Finalmente possiamo eseguire la nostra applicazione utilizzando questo script eseguendo <code>npm start</code> nel nostro terminale e dovremmo vedere che è in esecuzione sulla porta 3001:</p><pre><code class="language-bash">npm start

&gt; node server/index.js

Server listening on 3001</code></pre><figure class="kg-card kg-image-card"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/how-to-create-a-react-app-with-a-node-backend/clip-1.gif" class="kg-image" alt="Clip 1" width="600" height="400" loading="lazy"></figure><h2 id="passo-2-creare-un-endpoint-api">Passo 2: Creare un endpoint API</h2><p>Vogliamo utilizzare il nostro server Node con Express come un'API, in modo che possa fornire dati alla nostra applicazione React, modificarli o eseguire altre operazioni che solo un server può fare.</p><p>Nel nostro caso, invieremo semplicemente un messaggio alla nostra applicazione React che dice "Hello from server!" in un oggetto JSON.</p><p>Il codice sottostante crea un endpoint per la rotta <code>/api</code>.</p><p>Se la nostra applicazione React effettua una richiesta GET a tale rotta, risponderemo (usando <code>res</code>, che sta per response) con il nostro dato in formato JSON:</p><pre><code class="language-js">// server/index.js
...

app.get("/api", (req, res) =&gt; {
  res.json({ message: "Hello from server!" });
});

app.listen(PORT, () =&gt; {
  console.log(`Server listening on ${PORT}`);
});</code></pre><p><em>Nota: assicurati di posizionare questa funzione al di sopra della funzione</em> <code>app.listen</code><em>.</em></p><p>Poiché abbiamo apportato delle modifiche al codice Node, dobbiamo riavviare il nostro server.</p><p>Per farlo, devi terminare lo script di avvio nel terminale premendo <code>Command</code>/<code>Ctrl</code> + <code>C</code>. Quindi devi riavviare eseguendo nuovamente <code>npm start</code>.</p><p>Per verificarlo, possiamo semplicemente visitare <code>http://localhost:3001/api</code> nel nostro browser e visualizzare il nostro messaggio:</p><figure class="kg-card kg-image-card"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/how-to-create-a-react-app-with-a-node-backend/clip-2.gif" class="kg-image" alt="Clip 2" width="600" height="400" loading="lazy"></figure><h2 id="passo-3-creare-il-front-end-react"><strong>Passo 3: Creare il front end React</strong></h2><p>Dopo aver creato il back end, passiamo al front end.</p><p>Apriamo un'altra scheda di terminale e usiamo create-react-app per creare un nuovo progetto React con il nome <code>client</code>:</p><pre><code class="language-bash">npx create-react-app client</code></pre><p>Dopo di che, avremo un'applicazione React con tutte le sue dipendenze installate.</p><p>L'unica modifica da fare è aggiungere una proprietà chiamata <code>proxy</code> al nostro file package.json.</p><p>Questo ci permetterà di fare richieste al nostro server Node senza dover fornire l'origine su cui è in esecuzione (http://localhost:3001) ogni volta che facciamo una richiesta di rete:</p><pre><code class="language-bash">// client/package.json

...
"proxy": "http://localhost:3001",
...</code></pre><p>Quindi possiamo avviare la nostra applicazione React eseguendo il suo script di avvio, che è lo stesso del nostro server Node. Per prima cosa assicuriamoci di fare un <code>cd</code> nella cartella client appena creata.</p><p>Dopodiché, si avvierà su <code>localhost:3000</code>:</p><pre><code class="language-bash">cd client
npm start

Compiled successfully!

You can now view client in the browser.

Local:            http://localhost:3000</code></pre><figure class="kg-card kg-image-card"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/how-to-create-a-react-app-with-a-node-backend/clip-3.gif" class="kg-image" alt="Clip 3" width="600" height="400" loading="lazy"></figure><h2 id="passo-4-effettuare-richieste-http-da-react-a-node"><strong>Passo 4: </strong>Effettuare richieste HTTP da React a Node</h2><p>Ora che abbiamo un'applicazione React funzionante, vogliamo usarla per interagire con la nostra API.</p><p>Vediamo come recuperare i dati dall'endpoint <code>/api</code> che abbiamo creato in precedenza.</p><p>Per farlo, possiamo andare dal nostro componente <code>App.js</code> nella cartella <code>src</code> e fare una richiesta HTTP usando useEffect.</p><p>Faremo una semplice richiesta GET, utilizzando l'API Fetch, al nostro back end e ci verranno restituiti i dati in formato JSON.</p><p>Una volta che i dati ci saranno restituiti, otterremo la proprietà message (per avere il saluto che abbiamo inviato dal server) e la metteremo in una variabile di stato chiamata <code>data</code>.</p><p>Questo ci consentirà di visualizzare il messaggio nella nostra pagina, se presente. Utilizziamo una condizione nel JSX per dire che se i nostri dati non sono ancora presenti, deve essere mostrato il testo "Loading...".</p><pre><code class="language-js">// client/src/App.js

import React from "react";
import logo from "./logo.svg";
import "./App.css";

function App() {
  const [data, setData] = React.useState(null);

  React.useEffect(() =&gt; {
    fetch("/api")
      .then((res) =&gt; res.json())
      .then((data) =&gt; setData(data.message));
  }, []);

  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;img src={logo} className="App-logo" alt="logo" /&gt;
        &lt;p&gt;{!data ? "Loading..." : data}&lt;/p&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><figure class="kg-card kg-image-card"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/how-to-create-a-react-app-with-a-node-backend/clip-4.gif" class="kg-image" alt="Clip 5" width="600" height="400" loading="lazy"></figure><h2 id="passo-5-distribuire-la-app-sul-web-utilizzando-heroku"><strong>Passo 5: Distribuire la app sul web utilizzando Heroku</strong></h2><p>Infine, distribuiremo la nostra applicazione sul web.</p><p>Per prima cosa, all'interno della nostra cartella client, assicuriamoci di rimuovere il repository Git che viene inizializzato automaticamente da create-react-app.</p><p>Questo è essenziale per distribuire la nostra applicazione, perché inizializzeremo un repository Git nella cartella principale del nostro progetto (<code>react-node-app</code>), non nel <code>client</code>:</p><pre><code class="language-bash">cd client
rm -rf .git</code></pre><p>Al momento del deployment, sia il back end Node che il front end React saranno serviti sullo stesso dominio (cioè mycoolapp.herokuapp.com).</p><p>Vediamo come saranno gestite le nostre richieste &nbsp;dall'API di Node. Il nostro scopo è quello di visualizzare l'applicazione React quando viene richiesta dall'utente (per esempio, quando si va alla home page della nostra applicazione).</p><p>Possiamo farlo aggiungendo al file <code>server/index.js</code> il seguente codice:</p><pre><code class="language-js">// server/index.js
const path = require('path');
const express = require('express');

...

// Chiede a Node di servire i file per la nostra applicazione React
app.use(express.static(path.resolve(__dirname, '../client/build')));

// gestisce richieste GET per la rotta /api
app.get("/api", (req, res) =&gt; {
  res.json({ message: "Hello from server!" });
});

// Tutte le altre richieste di tipo GET non gestite dal metodo precedente, restituiranno l'applicazione REACT
app.get('*', (req, res) =&gt; {
  res.sendFile(path.resolve(__dirname, '../client/build', 'index.html'));
});</code></pre><p>Questo codice permetterà a Node di accedere al nostro progetto React di cui si è effettuato precedentemente un <code>build</code>, utilizzando la funzione <code>express.static</code> per i file statici.</p><p>Se arriva una richiesta GET che non è gestita dalla rotta <code>/api</code> route, il server risponderà con la nostra applicazione React.</p><p><strong>Questo codice consente alle nostre applicazioni React e Node di essere distribuite insieme sullo stesso dominio<strong>.</strong></strong></p><p>Possiamo comunicare alla nostra applicazione Node come farlo aggiungendo uno script di compilazione <code>build</code> al file package.json del server, che costruisce la nostra applicazione React per la produzione:</p><pre><code class="language-json">// server/package.json

...
"scripts": {
    "start": "node server/index.js",
    "build": "cd client &amp;&amp; npm install &amp;&amp; npm run build"
  },
...</code></pre><p>Consiglio anche di aggiungere un ulteriore campo chiamato "engines", in cui specificare la versione di Node che stiamo usando per costruire il progetto. Questa sarà usata per la distribuzione.</p><p>È possibile ottenere la versione di Node eseguendo <code>node -v</code> e inserire il risultato in "engines". (ad esempio 14.15.4):</p><pre><code class="language-json">// server/package.json

"engines": {
  "node": "la-tua-versione-di-node"
}</code></pre><p>Dopo di che, siamo pronti a eseguire il deployment utilizzando Heroku. Assicuriamoci di avere un account su Heroku.com.</p><p>Una volta effettuato l'accesso e visualizzata la dashboard, dovremo selezionare New &gt; Create New App e fornire un nome univoco all'applicazione.</p><p>Una volta fatto ciò, dovremo installare la Heroku CLI sul nostro computer, in modo da poter distribuire l'applicazione ogni volta che apportiamo modifiche utilizzando Git. È possibile installare la CLI eseguendo:</p><pre><code class="language-bash">npm i -g heroku</code></pre><p>Una volta installata, dobbiamo accedere a Heroku tramite la CLI utilizzando il comando <code>heroku login</code>:</p><pre><code class="language-bash">heroku login

Press any key to login to Heroku</code></pre><p>Una volta effettuato l'accesso, è sufficiente seguire le istruzioni di distribuzione per l'applicazione creata nella scheda "Deploy".</p><p>Con i quattro comandi seguenti, inizializzeremo un nuovo repository Git per il nostro progetto, vi aggiungeremo dei file, ne faremo il commit e inseriremo una destinazione remota Git per Heroku.</p><pre><code>git init
heroku git:remote -a insert-your-app-name-here
git add .
git commit -am "Deploy app to Heroku"</code></pre><p>L'ultimo passo consiste nel pubblicare la nostra applicazione, effettuando il <code>push</code> del commit sul Git di Heroku appena aggiunto:</p><pre><code class="language-bash">git push heroku master</code></pre><p>Congratulazioni! La nostra applicazione full-stack React e Node è in funzione! 🎉</p><figure class="kg-card kg-image-card"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/how-to-create-a-react-app-with-a-node-backend/clip-5.gif" class="kg-image" alt="Clip 5" width="600" height="400" loading="lazy"></figure><p>Quando desideri apportare modifiche all'applicazione (e distribuirle), è sufficiente utilizzare Git per aggiungere i file, eseguire il commit e quindi eseguire il push sul nostro sito Heroku:</p><pre><code class="language-bash">git add .
git commit -m "my commit message"
git push heroku master</code></pre><p>Grazie per aver letto questo articolo!</p><p>Buona programmazione.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Costruire un Componente di Paginazione Personalizzato in React ]]>
                </title>
                <description>
                    <![CDATA[ Spesso ci troviamo a lavorare con applicazioni web che devono recuperare grandi quantità di dati da un server tramite API e presentarli sullo schermo. Ad esempio, in un'applicazione per un social media si recuperano e si presentano i post e i commenti degli utenti. In una dashboard per la gestione ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-costruire-un-componente-di-paginazione-personalizzato-in-react/</link>
                <guid isPermaLink="false">631d986e9a423c074eb48cc0</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 26 Sep 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/custom-pagination-image.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/build-a-custom-pagination-component-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a Custom Pagination Component in React</a>
      </p><p>Spesso ci troviamo a lavorare con applicazioni web che devono recuperare grandi quantità di dati da un server tramite API e presentarli sullo schermo.</p><p>Ad esempio, in un'<strong>applicazione per un social media </strong>si recuperano e si presentano i post e i commenti degli utenti. In una <strong>dashboard per la gestione delle risorse umane</strong> si visualizzano informazioni sui candidati che fanno domanda per un posto di lavoro. In un <strong>Client Email</strong> si mostrano le mail dell'utente.</p><p>Presentare questi dati tutti in una volta sullo schermo potrebbe causare un considerevole rallentamento nel caricamento della pagina web, a causa del gran numero di elementi DOM presenti nella pagina stessa.</p><p>Se vuoi ottimizzare le prestazioni, è possibile adottare varie tecniche per presentare i dati in modo più efficiente. Alcuni di questi metodi includono lo <strong>scorrimento infinito con virtualizzazione</strong> e la <strong>paginazione</strong>.</p><p>La paginazione funziona bene quando la dimensione dei dati è nota in anticipo e non si devono fare frequenti aggiunte o cancellazioni all'insieme di dati.</p><p>Ad esempio, in un sito web di social media dove i nuovi post sono pubblicati ogni pochi millisecondi, la paginazione non sarebbe la soluzione ideale. Tuttavia andrebbe bene per una dashboard per la gestione delle risorse umane, dove sono visualizzate le domande dei candidati e devono essere anche ordinate o filtrate.</p><p>In questo articolo, ci focalizzeremo sulla paginazione e costruiremo un componente controllato personalizzato che gestisce i pulsanti della pagina in base alla pagina corrente e al conteggio totale dei dati.</p><p>Scriveremo anche un <em>hook</em> React personalizzato che fornisce un intervallo di numeri renderizzato dal componente di paginazione. Potremo usare questo <em>hook</em> indipendentemente, così come quando vogliamo presentare un componente di paginazione con stili diversi o in una diversa progettazione.</p><p>Di seguito, una dimostrazione di quello che realizzeremo in questo tutorial:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/PaginationDemo.gif" class="kg-image" alt="PaginationDemo" width="600" height="400" loading="lazy"></figure><h2 id="come-impostare-il-progetto"><strong>Come Impostare il Progetto</strong></h2><p>Se hai familiarità con l'impostazione di un progetto React puoi saltare questa sezione.</p><p>Per impostare il progetto React useremo il pacchetto da riga di comando <code><a href="https://github.com/facebook/create-react-app">create-react-app</a></code>. Puoi installare il pacchetto globalmente usando <code>npm install -g create-react-app</code> oppure <code>yarn add global create-react-app</code>.</p><p>Esegui <code>create-react-app</code> dalla riga di comando per creare un nuovo progetto, in questo modo:</p><pre><code>npx create-react-app react-pagination</code></pre><p>Successivamente, devi installare le dipendenze. Useremo una semplice dipendenza addizionale, chiamata <code>classnames</code>, che fornisce flessibilità nella gestione condizionale di valori multipli per l'attributo <code>className</code>.</p><p>Per installare il pacchetto, esegui <code>npm install classnames</code> oppure <code>yarn add classnames</code>.</p><p>Ora è possibile eseguire il progetto con il comando:</p><pre><code>yarn start</code></pre><p>oppure con il comando:</p><!--kg-card-begin: markdown--><p><code>npm start</code></p>
<!--kg-card-end: markdown--><h3 id="come-definire-l-interfaccia">Come Definire l'Interfaccia</h3><p>Ora che il progetto è in esecuzione, passeremo direttamente al componente di paginazione <code>Pagination</code>.<br><br>Prima di tutto, vediamo quali valori servono come <em>props</em> per il componente <code>Pagination</code>:</p><ul><li><strong><strong>totalCount</strong></strong>: rappresenta il conteggio totale dei dati disponibili dalla sorgente.</li><li><strong><strong>currentPage</strong></strong>:<strong><strong> </strong></strong>rappresenta la pagina attiva corrente. Useremo un <strong>indice a base 1</strong> invece del tradizionale indice a base 0 per il valore di <code>currentPage</code>.</li><li><strong><strong>pageSize</strong></strong>:<strong><strong> </strong></strong>rappresenta il massimo dei dati visibili in una singola pagina.</li><li><strong><strong>onPageChange</strong></strong>:<strong><strong> </strong></strong>funzione callback chiamata con il valore della pagina aggiornato quando la pagina viene cambiata.</li><li><strong><strong>siblingCount </strong></strong>(opzionale):<strong><strong> </strong></strong>rappresenta il numero minimo di bottoni di pagina da mostrare su ciascun lato del bottone della pagina corrente. Valore predefinito: 1.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/image-85.png" class="kg-image" alt="image-85" width="600" height="400" loading="lazy"><figcaption>Illustrazione di diversi valori di siblingCount</figcaption></figure><ul><li><strong><strong>className </strong></strong>(opzionale):<strong><strong> </strong></strong>nome di classe da aggiungere al contenitore di livello superiore.</li></ul><p>Dal componente di paginazione chiameremo l'<em>hook</em> <code>usePagination</code> che riceverà i seguenti parametri per calcolare gli intervalli di pagina: <code>totalCount</code>, <code>currentPage</code>, <code>pageSize</code>, <code>siblingCount</code>.</p><h2 id="come-implementare-l-hook-usepagination"><strong>Come Implementare l'<em>hook</em> usePagination</strong></h2><p>Qui sotto ci sono alcune cose che occorre tenere a mente durante l'implementazione dell'<em>hook</em> <code>usePagination</code>:</p><ul><li>L'<em>hook</em> di paginazione deve restituire l'intervallo di numeri da visualizzare nel componente di paginazione come un array.</li><li>La logica di calcolo deve essere rieseguita ogniqualvolta i valori di <code>currentPage</code>, <code>pageSize</code>, <code>siblingCount</code> o<code>totalCount</code> cambiano.</li><li>Il numero totale di elementi restituiti dall'<em>hook</em> dovrebbe rimanere costante. Questo eviterà il ridimensionamento del componente di paginazione se la lunghezza dell'array dell'intervallo cambia mentre l'utente sta interagendo con il componente.</li></ul><p>Tenendo conto di quanto sopra, creiamo un file chiamato <code>usePagination.js</code> nella cartella <code>src</code> del progetto e iniziamo con l'implementazione.</p><p>Il codice di base è il seguente:</p><pre><code class="language-js">export const usePagination = ({
  totalCount,
  pageSize,
  siblingCount = 1,
  currentPage
}) =&gt; {
  const paginationRange = useMemo(() =&gt; {
     // La logica di implementazione andrà qui 
      
  }, [totalCount, pageSize, siblingCount, currentPage]);

  return paginationRange;
};</code></pre><p>Se guardiamo il codice qui sopra, possiamo notare l'utilizzo dell'<em>hook</em> <code>useMemo</code> per calcolare la logica fondamentale. Il callback <code>useMemo</code> verrà eseguito quando cambia un qualunque valore nell'array di dipendenze.</p><p>Inoltre, impostiamo <code>1</code> come valore predefinito per la <em>prop</em> <code>siblingCount</code> come <em>prop</em> opzionale.</p><p>Prima di proseguire con l'implementazione della logica del codice, cerchiamo di 	comprendere i diversi comportamenti del componente <code>Pagination</code>. L'immagine qui sotto contiene gli stati possibili del componente di paginazione:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/image-80.png" class="kg-image" alt="image-80" width="600" height="400" loading="lazy"><figcaption>I diversi stati del componente Pagination</figcaption></figure><p>Nota che ci sono quattro stati possibili per il componente, che verranno analizzati uno per uno.</p><ul><li>Il conteggio di pagine totale è minore delle icone di pagina che si vogliono mostrare. In questo caso si ritorna l'intervallo da <code>1</code> a <code>totalPageCount</code>.</li><li>Il conteggio di pagine totale è maggiore delle icone di pagina ma sono visibili solo i puntini a destra.</li><li>Il conteggio di pagine totale è maggiore delle icone di pagina ma sono visibili solo i puntini a sinistra.</li><li>Il conteggio di pagine totale è maggiore delle icone di pagina e sono visibili i puntini su entrambi i lati.</li></ul><p>Come primo passo dobbiamo calcolare il numero totale di pagine da <code>totalCount</code> e <code>pageSize</code>, in questo modo:</p><pre><code class="language-js">const totalPageCount = Math.ceil(totalCount / pageSize);</code></pre><p>Nota che stiamo usando <code>Math.ceil</code> per arrotondare il numero alla cifra più vicina al prossimo valore intero più alto. Questo assicura che venga riservata una pagina extra per &nbsp;i dati rimanenti.</p><p>Successivamente, proseguiamo implementando una funzione personalizzata <code>range</code>, che riceve un valore &nbsp;<code>start</code> e un valore <code>end</code> e restituisce un array con gli elementi da start (inizio) fino a end (fine):</p><pre><code class="language-js">const range = (start, end) =&gt; {
  let length = end - start + 1;
  /*
  	Crea un array di una certa lunghezza e imposta gli elementi all'interno dal valore di start al valore di end.
  */
  return Array.from({ length }, (_, idx) =&gt; idx + start);
};</code></pre><p>Infine, implementeremo la logica fondamentale tenendo a mente i casi sopra citati.</p><!--kg-card-begin: markdown--><p><strong>n.d.t:</strong> per la comprensione del codice che segue, per <code>DOTS</code> si indende una costante definita ed esportata dall'hook <code>usePagination</code>, ed è una stringa che rappresenta 3 puntini.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-code-card"><pre><code class="language-js">export const usePagination = ({
  totalCount,
  pageSize,
  siblingCount = 1,
  currentPage
}) =&gt; {
  const paginationRange = useMemo(() =&gt; {
    const totalPageCount = Math.ceil(totalCount / pageSize);

    // Il conteggio delle pagine è determinato come siblingCount + firstPage + lastPage + currentPage + 2*DOTS
    const totalPageNumbers = siblingCount + 5;

    /*
      Caso 1:
      Se il numero di pagine è minore del numero da mostrare nel componente, restituiamo l'intervallo [1..totalPageCount]
    */
    if (totalPageNumbers &gt;= totalPageCount) {
      return range(1, totalPageCount);
    }
	
    /*
    	Calcola gli indici di destra e sinistra e si assicura che siano all'interno dell'intervallo 1 e totalPageCount
    */
    const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);
    const rightSiblingIndex = Math.min(
      currentPage + siblingCount,
      totalPageCount
    );

    /*
      Non mostriamo i puntini quando c'è un solo numero di pagina da inserire
      tra le estremità degli indici e i limiti di pagina, vale a dire 1 e totalPageCount.
      Quindi stiamo usando  leftSiblingIndex &gt; 2 e rightSiblingIndex &lt; totalPageCount - 2
    */
    const shouldShowLeftDots = leftSiblingIndex &gt; 2;
    const shouldShowRightDots = rightSiblingIndex &lt; totalPageCount - 2;

    const firstPageIndex = 1;
    const lastPageIndex = totalPageCount;

    /*
    	Caso 2: Non ci sono puntini a sinistra da mostrare ma 
        quelli a destra devono essere mostrati
    */
    if (!shouldShowLeftDots &amp;&amp; shouldShowRightDots) {
      let leftItemCount = 3 + 2 * siblingCount;
      let leftRange = range(1, leftItemCount);

      return [...leftRange, DOTS, totalPageCount];
    }

    /*
    	Caso 3: Non ci sono puntini a destra da mostrare ma 
        quelli a sinistra devono essere mostrati
    */
    if (shouldShowLeftDots &amp;&amp; !shouldShowRightDots) {
      
      let rightItemCount = 3 + 2 * siblingCount;
      let rightRange = range(
        totalPageCount - rightItemCount + 1,
        totalPageCount
      );
      return [firstPageIndex, DOTS, ...rightRange];
    }
     
    /*
    	Caso 4: Sia i puntini a destra che quelli a sinistra 
        sono da mostrare
    */
    if (shouldShowLeftDots &amp;&amp; shouldShowRightDots) {
      let middleRange = range(leftSiblingIndex, rightSiblingIndex);
      return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];
    }
  }, [totalCount, pageSize, siblingCount, currentPage]);

  return paginationRange;
};
</code></pre><figcaption>usePagination Custom hook implementation&nbsp;</figcaption></figure><p>L'idea dell'implementazione è che identifichiamo l'intervallo di numeri da mostrare nel componente, per poi unirli ai separatori o puntini, quando viene restituito l'intervallo finale.</p><p>Per il primo scenario dove &nbsp;<code>totalPageCount</code> è minore del numero totale di icone, calcolato in base agli altri parametri, restituiamo semplicemente un intervallo di numeri &nbsp;<code>1..totalPageCount</code> .</p><p>Per gli altri scenari, occorre identificare se servono i puntini alla sinistra o alla destra di <code>currentPage</code> calcolando gli indici di destra e sinistra dopo avere incluso le icone sorelle a <code>currentPage</code> e quindi prendere le decisioni.</p><p>Una volta che sappiamo dove vogliamo mostrare i puntini, il resto dei calcoli è piuttosto semplice.</p><h2 id="come-implementare-il-componente-pagination"><strong>Come Implementare il Componente Pagination</strong></h2><p>Come detto in precedenza, useremo l'<em>hook</em> <code>usePagination</code> nel componente di paginazione e verrà usato nell'interazione sull'intervallo restituito per presentarlo.</p><p>Creiamo un file <code>Pagination.js</code> nella cartella <code>src</code> e implementiamo la logica del codice in questo modo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React from 'react';
import classnames from 'classnames';
import { usePagination, DOTS } from './usePagination';
import './pagination.scss';
const Pagination = props =&gt; {
  const {
    onPageChange,
    totalCount,
    siblingCount = 1,
    currentPage,
    pageSize,
    className
  } = props;

  const paginationRange = usePagination({
    currentPage,
    totalCount,
    siblingCount,
    pageSize
  });

  // Se l'intervallo di paginazione è minore di due il componente non viene presentato
  if (currentPage === 0 || paginationRange.length &lt; 2) {
    return null;
  }

  const onNext = () =&gt; {
    onPageChange(currentPage + 1);
  };

  const onPrevious = () =&gt; {
    onPageChange(currentPage - 1);
  };

  let lastPage = paginationRange[paginationRange.length - 1];
  return (
    &lt;ul
      className={classnames('pagination-container', { [className]: className })}
    &gt;
       {/* Freccia di navigazione sinistra */}
      &lt;li
        className={classnames('pagination-item', {
          disabled: currentPage === 1
        })}
        onClick={onPrevious}
      &gt;
        &lt;div className="arrow left" /&gt;
      &lt;/li&gt;
      {paginationRange.map(pageNumber =&gt; {
         
        // Se  pageItem è DOTS si presenta il carattere unicode per i puntini
        if (pageNumber === DOTS) {
          return &lt;li className="pagination-item dots"&gt;&amp;#8230;&lt;/li&gt;;
        }
		
        // Presenta le pillole di pagina
        return (
          &lt;li
            className={classnames('pagination-item', {
              selected: pageNumber === currentPage
            })}
            onClick={() =&gt; onPageChange(pageNumber)}
          &gt;
            {pageNumber}
          &lt;/li&gt;
        );
      })}
      {/*  Freccia di navigazione destra */}
      &lt;li
        className={classnames('pagination-item', {
          disabled: currentPage === lastPage
        })}
        onClick={onNext}
      &gt;
        &lt;div className="arrow right" /&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  );
};

export default Pagination;
</code></pre><figcaption>Implementazione di Pagination</figcaption></figure><p>Non presentiamo il componente <code>Pagination</code> se ci sono meno di due pagine (quindi restituiamo <code>null</code>).</p><p>Il componente &nbsp;<code>Pagination</code> viene presentato come una lista con le frecce destra e sinistra che gestiscono le azioni di spostamento in avanti o indietro compiute dall'utente. Tra le frecce stabiliamo una corrispondenza attraverso <code>paginationRange</code> e presentiamo i numeri di pagina come <code>pagination-items</code>. Se l'elemento della pagina è <code>DOTS</code>, viene presentato il carattere unicode corrispondente ai puntini di sospensione.</p><p>Come gestione speciale, aggiungiamo una classe <code>disabled</code> alle frecce sinistra/destra per renderle inattive se <code>currentPage</code> è rispettivamente la prima o l'ultima pagina. Disabilitiamo <code>pointer-events</code> e aggiorniamo gli stili delle icone di freccia tramite CSS se l'icona deve essere disabilitata.</p><p>Vengono anche aggiunti gestori di evento click alle pillole di pagina che chiameranno la funzione callback <code>onPageChanged</code> con il valore aggiornato di &nbsp;<code>currentPage</code>.</p><p>Il file CSS conterrà i seguenti stili:</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.pagination-container {
  display: flex;
  list-style-type: none;

  .pagination-item {
    padding: 0 12px;
    height: 32px;
    text-align: center;
    margin: auto 4px;
    color: rgba(0, 0, 0, 0.87);
    display: flex;
    box-sizing: border-box;
    align-items: center;
    letter-spacing: 0.01071em;
    border-radius: 16px;
    line-height: 1.43;
    font-size: 13px;
    min-width: 32px;

    &amp;.dots:hover {
      background-color: transparent;
      cursor: default;
    }
    &amp;:hover {
      background-color: rgba(0, 0, 0, 0.04);
      cursor: pointer;
    }

    &amp;.selected {
      background-color: rgba(0, 0, 0, 0.08);
    }

    .arrow {
      &amp;::before {
        position: relative;
        /* top: 3pt; Togliere il commento per abbassare le icone come richiesto nei commenti*/
        content: '';
        /* Usando una scala em, le dimensione delle frecce sarà relativa a quella del font*/
        display: inline-block;
        width: 0.4em;
        height: 0.4em;
        border-right: 0.12em solid rgba(0, 0, 0, 0.87);
        border-top: 0.12em solid rgba(0, 0, 0, 0.87);
      }

      &amp;.left {
        transform: rotate(-135deg) translate(-50%);
      }

      &amp;.right {
        transform: rotate(45deg);
      }
    }

    &amp;.disabled {
      pointer-events: none;

      .arrow::before {
        border-right: 0.12em solid rgba(0, 0, 0, 0.43);
        border-top: 0.12em solid rgba(0, 0, 0, 0.43);
      }

      &amp;:hover {
        background-color: transparent;
        cursor: default;
      }
    }
  }
}
</code></pre><figcaption>Stili del componente di paginazione</figcaption></figure><p><strong>Questo è tutto<strong>!</strong></strong><br><br>L'implementazione di paginazione generica è pronta e possiamo usarla in qualunque parte del nostro codebase.</p><h2 id="come-usare-il-componente-di-paginazione-personalizzato"><strong>Come Usare il Componente di Paginazione Personalizzato</strong></h2><p>Come ultimo passo, incorporiamo il componente in un piccolo esempio.</p><p>Per lo scopo di questo articolo, presenteremo dati statici in forma di tabella. Quindi per prima cosa scriviamo:</p><pre><code class="language-js">import React from 'react';
import data from './data/mock-data.json';

export default function App() {
  return (
    &lt;&gt;
      &lt;table&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th&gt;ID&lt;/th&gt;
            &lt;th&gt;FIRST NAME&lt;/th&gt;
            &lt;th&gt;LAST NAME&lt;/th&gt;
            &lt;th&gt;EMAIL&lt;/th&gt;
            &lt;th&gt;PHONE&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          {data.map(item =&gt; {
            return (
              &lt;tr&gt;
                &lt;td&gt;{item.id}&lt;/td&gt;
                &lt;td&gt;{item.first_name}&lt;/td&gt;
                &lt;td&gt;{item.last_name}&lt;/td&gt;
                &lt;td&gt;{item.email}&lt;/td&gt;
                &lt;td&gt;{item.phone}&lt;/td&gt;
              &lt;/tr&gt;
            );
          })}
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/&gt;
  );
}</code></pre><p>A questo punto l'interfaccia utente si presenta come segue:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/InfiniteTable-1.gif" class="kg-image" alt="InfiniteTable-1" width="600" height="400" loading="lazy"></figure><p>Ora occorrono due cose per incorporare il componente &nbsp;<code>Pagination</code>.</p><ul><li>Primo, manteniamo uno stato <code>currentPage</code>.</li><li>Secondo, calcoliamo i dati da presentare per una data pagina, ci iteriamo su per poi presentarli.</li></ul><p>Per lo scopo di questa dimostrazione, manteniamo <code>PageSize</code> costante impostandone il valore a <code>10</code>. Possiamo anche fornire un selettore per l'utente in modo che possa selezionare la dimensione della pagina desiderata.<br><br>Una volta effettuate le modifiche, possiamo proseguire con la presentazione del componente <code>Pagination</code> con le <em>props</em> appropriate.</p><p>Con queste modifiche in mente, il codice finale sarà questo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import React, { useState, useMemo } from 'react';
import Pagination from '../Pagination';
import data from './data/mock-data.json';
import './style.scss';

let PageSize = 10;

export default function App() {
  const [currentPage, setCurrentPage] = useState(1);

  const currentTableData = useMemo(() =&gt; {
    const firstPageIndex = (currentPage - 1) * PageSize;
    const lastPageIndex = firstPageIndex + PageSize;
    return data.slice(firstPageIndex, lastPageIndex);
  }, [currentPage]);

  return (
    &lt;&gt;
      &lt;table&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th&gt;ID&lt;/th&gt;
            &lt;th&gt;FIRST NAME&lt;/th&gt;
            &lt;th&gt;LAST NAME&lt;/th&gt;
            &lt;th&gt;EMAIL&lt;/th&gt;
            &lt;th&gt;PHONE&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          {currentTableData.map(item =&gt; {
            return (
              &lt;tr&gt;
                &lt;td&gt;{item.id}&lt;/td&gt;
                &lt;td&gt;{item.first_name}&lt;/td&gt;
                &lt;td&gt;{item.last_name}&lt;/td&gt;
                &lt;td&gt;{item.email}&lt;/td&gt;
                &lt;td&gt;{item.phone}&lt;/td&gt;
              &lt;/tr&gt;
            );
          })}
        &lt;/tbody&gt;
      &lt;/table&gt;
      &lt;Pagination
        className="pagination-bar"
        currentPage={currentPage}
        totalCount={data.length}
        pageSize={PageSize}
        onPageChange={page =&gt; setCurrentPage(page)}
      /&gt;
    &lt;/&gt;
  );
}

</code></pre><figcaption>Codice finale della dimostrazione</figcaption></figure><p>Ecco la dimostrazione dal vivo di questo tutorial:</p><figure class="kg-card kg-embed-card"><iframe src="https://stackblitz.com/edit/react-1zaeqk?embed=1&amp;file=src%2FPagination.js" height="400" width="745" title="Embedded content" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle;"></iframe></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo abbiamo creato un <em>hook</em> personalizzato <code>usePagination</code> e lo abbiamo usato all'interno del componente <code>Pagination</code>. Abbiamo anche implementato una breve dimostrazione che fa uso di questo componente.</p><p>Puoi vedere l'intero codice sorgente per questo tutorial in questo <a href="https://github.com/mayankshubham/react-pagination">repository GitHub</a>.<br><br>Grazie per aver letto questo articolo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Un Modo Migliore per Strutturare i Progetti in React ]]>
                </title>
                <description>
                    <![CDATA[ Ciao a tutti! Molte parole sono già state spese a proposito di argomenti relativamente facili come "Fare X in React" o "Usare React con la tecnologia X". In questo articolo, invece, voglio parlare delle esperienze che ho avuto costruendo front end da zero presso Delightchat [https://delightchat.io/] e precedentemente in altre ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/un-modo-migliore-per-strutturare-i-progetti-in-react/</link>
                <guid isPermaLink="false">631a2f889a423c074eb47eb1</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Fri, 09 Sep 2022 15:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/z02wxvp94dwg84c4ifhj.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/a-better-way-to-structure-react-projects/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A Better Way to Structure React Projects</a>
      </p><p>Ciao a tutti! Molte parole sono già state spese a proposito di argomenti relativamente facili come "Fare X in React" o "Usare React con la tecnologia X".</p><p>In questo articolo, invece, voglio parlare delle esperienze che ho avuto costruendo front end da zero presso <a href="https://delightchat.io/">Delightchat</a> e precedentemente in altre aziende.</p><p>Questi progetti richiedono una comprensione più profonda di React e un prolungato utilizzo in un contesto di produzione.</p><h2 id="introduzione"><strong>Introduzione</strong></h2><p>In breve, un progetto React complesso dovrebbe essere strutturato in questo modo. Sebbene io utilizzi NextJS in produzione, questa struttura di file dovrebbe essere abbastanza utile in qualsiasi impostazione di React.</p><pre><code>src
|---adapters
|---contexts
|---components
|---styles
|---pages
</code></pre><p><em>Nota: nella struttura di file qui sopra, le risorse o i file statici dovrebbero essere inseriti in una qualunque variante della cartella </em><code>public</code> <em>per il proprio framework</em>.</p><p>Passiamo a esaminare le cartelle qui sopra in ordine.</p><h2 id="1-adattatori"><strong>1. Adattatori</strong></h2><p>Gli <strong>adattatori </strong>(adapter) sono i connettori di una applicazione con il mondo esterno. Qualsiasi forma di chiamata API o interazione websocket necessaria per condividere dati con un servizio esterno o un client dovrebbe verificarsi all'interno dell'adattatore stesso.</p><p>Ci sono casi in cui alcuni dati sono sempre condivisi tra tutti gli adattatori – ad esempio, la condivisione di cookie, URL base e header su tutti gli adattatori AJAX (XHR). Questi possono essere inizializzati nella cartella xhr, quindi importati all'interno di altri adattatori da usare successivamente.</p><p>La struttura avrà questo aspetto:</p><pre><code>adapters
|---xhr
|---page1Adapter
|---page2Adapter
</code></pre><p>Nel caso di axios, puoi usare <code>axios.create</code> per creare un adattatore base ed esportare questa istanza inizializzata, oppure creare funzioni diverse per get, post, patch e delete per una ulteriore astrazione. Qualcosa di questo tipo:</p><pre><code>// adapters/xhr/index.tsx

import Axios from "axios";

function returnAxiosInstance() {
  return Axios.create(initializers);
}

export function get(url){
  const axios = returnAxiosInstance();
  return axios.get(url);
}

export function post(url, requestData){
  const axios = returnAxiosInstance();
  return axios.post(url, requestData);
}

... e così via ...
</code></pre><p>Dopo che il file di base (o i file) è pronto, crea un file adattatore separato per ciascuna pagina, o ciascun insieme di funzionalità, a seconda della complessità dell'applicazione. Una funzione con un nome descrittivo rende molto facile comprendere ciò che fa ciascuna chiamata API e quello che dovrebbe ottenere.</p><pre><code>// adapters/page1Adapter/index.tsx

import { get, post } from "adapters/xhr";
import socket from "socketio";

// funzioni con nome descrittivo
export function getData(){
  return get(someUrl);
}

export function setData(requestData){
  return post(someUrl, requestData);
}

... e così via ...
</code></pre><p>In che modo gli adattatori possono essere utili? Scopriamolo nella prossima sezione.</p><h2 id="2-componenti"><strong>2. Componenti</strong></h2><p>Sebbene in questa sezione dovremmo parlare dei contesti, vorrei parlare prima dei componenti. Questo per capire il motivo per cui è richiesto (e necessario) un contesto in applicazioni complesse.</p><p>I <strong>componenti </strong>(component) sono la linfa vitale di un'applicazione. Gestiscono l'interfaccia utente (UI) dell'applicazione e possono talvolta contenere la logica di business e anche qualsiasi stato che debba essere mantenuto.</p><p>Nel caso in cui un componente diventi troppo complesso per esprimere una logica di business con una interfaccia utente, è meglio essere in grado di dividerlo in un file bl.tsx separato, con la radice index.tsx che importa tutte le funzioni e i gestori da esso.</p><p>La struttura dovrebbe essere simile a questa:</p><pre><code>components
|---page1Components
        |--Component1
        |--Component2
|---page2Component
        |--Component1
               |---index.tsx
               |---bl.tsx
</code></pre><p>In questa struttura, ogni pagina è contenuta nella propria cartella all'interno di components, in modo che sia agevole scoprire su cosa influisce ogni componente.</p><p>È anche importante limitare l'ambito di azione di un componente. Vale a dire che un componente dovrebbe usare solo adattatori per il recupero dei dati, avere un file separato per logiche di business complesse, e focalizzarsi solo sulla parte dell'interfaccia utente.</p><pre><code>// components/page1Components/Component1/index.tsx

import businessLogic from "./bl.tsx";

export default function Component2() {
  
  const { state and functions } = businessLogic();

  return {
    // JSX
  }
}
</code></pre><p>Mentre il file con la logica di business importa solo i dati e li restituisce:</p><pre><code>// components/page1Components/Component1/bl.tsx

import React, {useState, useEffect} from "react";
import { adapters } from "adapters/path_to_adapter";

export default function Component1Bl(){
  const [state, setState] = useState(initialState);

  useEffect(() =&gt; {
    fetchDataFromAdapter().then(updateState);
  }, [])
}

</code></pre><p>Tuttavia, c'è un problema che è comune nell'ambito di tutte le applicazioni complesse. La gestione dello stato e come condividere lo stato attraverso componenti distanti fra loro. Per esempio, consideriamo la seguente struttura di file:</p><pre><code>components
|---page1Components
        |--Component1
               |---ComponentA
|---page2Component
        |--ComponentB
</code></pre><p>Se occorre condividere un qualche stato attraverso <code>ComponentA</code> e <code>ComponentB</code>, nell'esempio qui sopra, esso dovrebbe essere passato attraverso tutti i componenti intermedi, e anche a qualsiasi altro componente che voglia interagire con lo stato.</p><p>Per risolvere ciò ci sono parecchie soluzioni che possono essere usate, come Redux, Easy-Peasy e React Context, ognuna della quali ha i propri pro e contro. In generale, React Context dovrebbe essere "sufficientemente valido" per risolvere questo problema. Tutti i file relativi al contesto vengono conservati in <code>contexts</code>.</p><h2 id="3-contesti"><strong>3. Contesti</strong></h2><p>La cartella <code>contexts</code> è una cartella minimale che contiene solo lo stato che deve essere condiviso tra questi componenti. Ciascuna pagina può avere parecchi <strong>contesti </strong>annidati, ciascuno dei quali fa solamente da tramite per passare i dati verso il basso nella gerarchia. Tuttavia, per evitare complessità, è meglio avere un singolo file di contesto. La struttura dovrebbe essere tipo questa:</p><pre><code>contexts
|---page1Context
        |---index.tsx (Esporta consumer, provider, ...)
        |---Context1.tsx (Contiene parte dello stato)
        |---Context2.tsx (Contiene parte dello stato)
|---page2Context
        |---index.tsx (Abbastanza semplice da avere anche lo stato)
</code></pre><p>Nel caso qui sopra, visto che <code>page1</code> potrebbe essere un poco più complessa, è consentito un qualche contesto annidato passando al genitore il contesto figlio. Tuttavia, generalmente, un singolo file <code>index.tsx</code> che contenga lo stato ed esporti i file rilevanti dovrebbe essere sufficiente.</p><p>Non approfondirò la parte relativa all'implementazione delle librerie relative alla gestione dello stato di React, visto che ognuna di esse è distinta dalle altre e ha i propri vantaggi e svantaggi. Di conseguenza, raccomando di seguire il tutorial di qualunque cosa decidi di usare per impararne le migliori pratiche.</p><p>Al contesto è consentito importare dagli <code>adattatori</code> per recuperare dati e reagire a effetti esterni. Nel caso di React Context, i provider sono importati all'interno delle pagine per condividere lo stato tra tutti i componenti, usando qualcosa tipo <code>useContext</code> all'interno di questi <code>componenti</code><strong> </strong>per riuscire a utilizzare i dati.</p><p>E ora passiamo all'ultimo grande pezzo del puzzle, le <strong>pagine</strong>.</p><h2 id="4-pagine"><strong>4. Pagine</strong></h2><p>Voglio evitare di essere di parte rispetto a un framework per questo articolo, ma in generale, avere una cartella specifica nella quale piazzare componenti a livello di rotta è una buona pratica.</p><p>Gatsby e NextJS obbligano ad avere tutte le rotte in una cartella chiamata <code>pages</code>. Questo è un modo piuttosto leggibile per definire componenti a livello di rotta, e mimando questo in una applicazione generata con CRA (create-react-app) si ha come risultato anche una migliore leggibilità del codice.</p><p>Un punto centralizzato per le rotte aiuta anche all'utilizzo della funzionalità "Vai Al File" della maggior parte degli ambienti di sviluppo integrati (IDE) per accedere a un file usando <code>Cmd</code> (o <code>Ctrl</code>) + Click su un'istruzione di import.</p><p>Questo aiuta a spostarsi attraverso il codice velocemente, avendo chiara l'appartenenza di ogni cosa. Imposta anche una chiara gerarchia di differenziazione tra pagine e componenti, laddove una pagina può importare un componente per visualizzarlo senza fare altro, neppure logica di business.</p><p>In ogni caso, è possibile importare fornitori di contesto (context provider) all'interno di una pagina, in modo che i componenti figli li possano utilizzarli. Oppure, nel caso di NextJS, scrivere del codice lato server in grado di passare dati ai componenti usando <code>getServerSideProps</code> o <code>getStaticProps</code>.</p><h2 id="5-stili"><strong>5. Stili</strong></h2><p>Infine, eccoci agli <strong>stili</strong>. Nonostante il mio metodo sia di incorporare semplicemente gli stili all'interno dell'interfaccia utente usando una soluzione CSS-in-JS come gli styled-component, a volte è utile avere un insieme globale di stili in un file CSS.</p><p>Un puro e semplice file CSS è più condivisibile tra i progetti e può anche agire sul &nbsp;CSS di componenti, laddove non possono arrivare gli styled-component (ad esempio componenti di terze parti).</p><p>Quindi, è possibile conservare tutti questi file CSS all'interno di una cartella &nbsp;<code>styles</code> e importarli o linkarli liberamente da qualsiasi parte desideri.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 7 progetti React che dovresti sviluppare nel 2021 ]]>
                </title>
                <description>
                    <![CDATA[ React è una libreria JavaScript ideale per sviluppare applicazioni impressionanti. Ci sono infiniti progetti che puoi sviluppare con React, mentre qui ne ho riportati sette dalla mia lista dei progetti da sviluppare nel 2021. Perché ho selezionato questi sette progetti in particolare? Li ho scelti perché si sviluppano l'uno dall'altro. ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/7-progetti-react-che-dovresti-realizzare-nel-2021/</link>
                <guid isPermaLink="false">62fe52d503346c07472e9ec7</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Adina Ioana Tica ]]>
                </dc:creator>
                <pubDate>Mon, 22 Aug 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/7-react-projects-for-2021-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/react-projects-you-should-build-this-year/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">7 React Projects You Should Build in 2021</a>
      </p><p>React è una libreria JavaScript ideale per sviluppare applicazioni impressionanti. Ci sono infiniti progetti che puoi sviluppare con React, mentre qui ne ho riportati sette dalla mia lista dei progetti da sviluppare nel 2021.</p><p><em>Perché ho selezionato questi sette progetti in particolare?</em> Li ho scelti perché si sviluppano l'uno dall'altro. Richiedono che tu conosca concetti essenziali analoghi come l'autenticazione, il modo di lavorare con una API e con i database, usare un router React per aggiungere pagine alla tua app e riprodurre media come audio o video.</p><p>Inoltre, molte applicazioni possono essere (e spesso lo sono) integrate l'una nell'altra. I social media possono includere app per chattare, le app di musica e video possono includere app di e-commerce, e così via.</p><p>In altre parole, <strong>sviluppare uno qualsiasi di questi progetti</strong> ti darà le abilità e le conoscenze richieste per costruire le restanti applicazioni della lista, inclusi i tuoi progetti personali.</p><p>Per ogni progetto, ho fornito vari esempi pratici che puoi usare per trovare ispirazione, più alcune idee riguardanti gli strumenti che proverò ad utilizzare per costruire ogni app.</p><h2 id="1-app-per-chattare-in-tempo-reale"><strong>1. &nbsp;App per chattare in tempo reale</strong></h2><p><strong>Esempi reali</strong>: Slack, Messenger, Discord, Crisp Chat</p><p>In pratica, tutti noi usiamo un tipo di app per chattare in tempo reale, che sia una app per il telefono come Whatsapp o Viber oppure strumenti per la produttività come Slack o Discord. Potrebbe anche far parte di un widget di chat all'interno di un sito web in cui i clienti possono parlare direttamente con i proprietari del sito.</p><p>Tutte le applicazioni per chattare permettono agli utenti di inviare messaggi agli altri in tempo reale, di reagire ai messaggi e mostrano quando gli utenti sono online oppure offline.</p><h3 id="come-sviluppare-una-app-per-chattare-in-tempo-reale-"><strong>Come sviluppare una app per chattare in tempo reale:</strong></h3><ul><li>Costruisci il tuo progetto con create-react-app oppure Next.js</li><li>Usa un servizio come Firebase oppure le iscrizioni GraphQL per mandare e ricevere messaggi agli utenti</li><li>Aggiungi reazioni ai messaggi con le emoji usando il pacchetto npm emoji-mart</li><li>Esegui il deployment sul web usando strumenti di Firebase</li></ul><h2 id="2-app-per-un-social-media"><strong>2. App per un social media</strong></h2><p><strong>Esempi reali</strong>: Facebook, Twitter, Instagram</p><p>Le app con le quali hai più familiarità sono i social media. In parte, sono simili alle app per chattare, ma sono estese a una comunità di utenti più grande.</p><p>Gli utenti possono interagire l'uno con l'altro in diversi modi: possono seguirsi a vicenda per vedere i post, aggiungere media come immagini e video da condividere con gli altri e interagire con i post mettendo like o commentandoli.</p><h3 id="come-sviluppare-una-app-per-un-social-media"><strong>Come sviluppare una app per un social media</strong></h3><ul><li>Sviluppa il tuo front end con create-react-app, e il back end usando una API Node</li><li>Usa un database come Postgres o MongoDB, con un ORM come Prisma (Postgres) o Mongoose (MongoDB)</li><li>Usa l'autenticazione social con Google, Facebook o Twitter, usando Passport oppure un servizio più semplice come Auth0</li><li>Esegui il deployment del back end su Heroku e del front end su Netlify</li></ul><h2 id="3-app-di-e-commerce"><strong>3. App di e-commerce</strong></h2><p><strong>Esempi reali<strong>:</strong></strong> Shopify, Etsy, Dev.to Storefront</p><p>Le vetrine online dove possiamo comprare prodotti digitali o fisici sono ovunque. Le app di e-commerce permettono agli utenti di aggiungere o rimuovere oggetti da un carrello, di visualizzare il proprio carrello e pagare utilizzando una carta di credito, così come con altre opzioni di pagamento come Google Pay o Apple Pay.</p><p>Se stai cercando ispirazione, dai un'occhiata ad alcune vetrine più semplici come Shopify invece di un grande rivenditore come Amazon o Walmart.</p><h3 id="come-sviluppare-un-app-di-e-commerce-"><strong>Come sviluppare un app di e-commerce :</strong></h3><ul><li>Crea l'app con create-react-app o Next.js</li><li>Aggiungi il pacchetto NPM <code>stripe</code> &nbsp;e <code>use-shopping-cart</code> per gestire facilmente i pagamenti direttamente con Stripe Checkout</li><li>Sviluppa una API Node per gestire la creazione di sessioni con Stripe</li><li>Esegui il deployment del back end su Heroku, del front end su Netlify (oppure entrambi su Heroku)</li></ul><h2 id="4-app-per-la-condivisione-di-video"><strong>4. App per la condivisione di video</strong></h2><p><strong>Esempi reali<strong>:</strong></strong> YouTube, TikTok, Snapchat</p><p>Una app per la condivisione di video è probabilmente una delle categorie più varie, poiché i video sono utilizzati su diverse piattaforme e in modi diversi.</p><p>Esistono app per la condivisione di video come Youtube che ti permettono di cercare su qualsiasi browser e di guardare qualsiasi video che potresti immaginare che gli utenti abbiano creato. Inoltre, Tiktok e Snapchat ci permettono di guardare video di altri utenti registrati in un tempo ancora più breve, in un formato più accessibile e sono più orientati sulle interazioni come i like e le visualizzazioni.</p><h3 id="come-costruire-una-app-per-condividere-video"><strong>Come costruire una app per condividere video</strong></h3><ul><li>Crea l'app con create-react-app e sviluppa il back end con Node/Express</li><li>Usa Cloudinary per i caricamenti delle immagini e dei video sulla API di Cloudinary</li><li>Usa un database come Postgres o MongoDB, insieme a un ORM come Prisma (Postgres) o Mongoose (MongoDB)</li><li>Esegui il deployment del back end su Heroku, del front end su Netlify (oppure entrambi su Heroku)</li></ul><h2 id="5-app-per-un-blog-portfolio"><strong>5. App per un blog/portfolio</strong></h2><p><strong>Esempi reali:</strong> Medium, Dev.to, HashNode</p><p>Questo esempio di app è il più pratico. Creare un blog o un portfolio è la scelta pratica più diretta per mettere in mostra le tue abilità. Ti consente di mostrare cosa puoi fare come sviluppatore, permettendoti anche di includere post e contenuti che riflettono ciò che sai.</p><p>Sviluppare queste app con strumenti come Gatsby o Nextjs (entrambi framework di React) ora è più facile che mai.</p><h3 id="come-sviluppare-una-app-per-un-blog-portfolio-"><strong>Come sviluppare una app per un blog/portfolio :</strong></h3><ul><li>Sviluppa l'app con Gatsby o Next.js</li><li>Usa il markdown per i post del blog con un plugin particolare come <code>remark</code> che converte il markdown</li><li>Esegui il deployment del sito su Netlify o Vercel</li></ul><h2 id="6-app-per-forum"><strong>6. App per forum</strong></h2><p><strong>Esempi reali<strong>:</strong></strong> Reddit, StackOverflow, freeCodeCamp Forum</p><p>Un forum è il posto in cui andiamo quando abbiamo bisogno di aiuto, ed essendo programmatori visitiamo forum come Reddit e Stack Overflow per ottenere risposte alle nostre domande di programmazione.</p><p>Inoltre, i forum combinano vari elementi delle app per chattare e social media attraverso post, commenti e reazioni. Un forum è come una versione più organizzata di una app di social media, in cui gli utenti possono trovare più facilmente le risposte alle domande che stanno cercando.</p><h3 id="come-sviluppare-una-app-per-forum-"><strong>Come sviluppare una app per forum:</strong></h3><ul><li>Sviluppa il front end con create-react-app e il back end usando una API Node</li><li>Usa un database come Postgres o MondoDB, insieme ad un ORM come Prisma (Postgres) o Mongoose (MongoDB)</li><li>Usa l'autenticazione social con Google, Facebook o Twitter, usando Passport oppure un servizio più semplice come Auth0</li><li>Esegui il deployment del back end su Heroku e del front end su Netlify</li></ul><h2 id="7-app-di-musica-in-streaming"><strong>7. App di musica in streaming</strong></h2><p><strong>Esempi reali<strong>:</strong></strong> Spotify, Soundcloud, Pandora</p><p>Le app in React sono perfette per mostrare contenuti video così come sono ottime per i media in streaming come la musica.</p><p>Le app di musica hanno una struttura simile alle app di condivisione dei video e possono o non possono permettere agli utenti di caricare la propria musica. Queste app permettono agli utenti di ascoltare musica, mettere like alle canzoni, commentarle ed eventualmente anche di comprare musica.</p><p>In questo modo, una app di musica in streaming può unire elementi delle app di condivisione dei video a quelli delle app di e-commerce.</p><h3 id="come-sviluppare-una-app-di-musica-in-streaming"><strong>Come sviluppare una app di musica in streaming</strong></h3><ul><li>Crea l'app con create-react-app, e sviluppa il &nbsp;back end con Node/Express</li><li>Usa Cloudinary per i caricamenti delle immagini e dei video sull'API di Cloudinary</li><li>Usa un database come Postgres o MondoDB, insieme ad un ORM come Prisma (Postgres) o Mongoose (MongoDB)</li><li>Esegui il deployment del back end su Heroku, del front end su Netlify (oppure entrambi su &nbsp;Heroku)</li></ul><p>Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Componenti funzionali, props e JSX in React – Un Tutorial per principianti su React.js ]]>
                </title>
                <description>
                    <![CDATA[ React è una delle librerie JavaScript più popolari per la realizzazione di interfacce utente. Se vuoi diventare uno sviluppatore front-end o trovare un lavoro nel campo dello sviluppo web, probabilmente è bene che tu conosca approfonditamente React. In questo articolo, imparerai alcuni concetti di base di React come creare un ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/componenti-funzionali-props-e-jsx-in-react-un-tutorial-per-principianti-su-react-js/</link>
                <guid isPermaLink="false">62ea632d5cda1d06d40dc034</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Wed, 10 Aug 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/Copy-of-Add-a-heading.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/react-components-jsx-props-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Functional Components, Props, and JSX – React.js Tutorial for Beginners</a>
      </p><p>React è una delle librerie JavaScript più popolari per la realizzazione di interfacce utente.</p><p>Se vuoi diventare uno sviluppatore front-end o trovare un lavoro nel campo dello sviluppo web, probabilmente è bene che tu conosca approfonditamente React.</p><p>In questo articolo, imparerai alcuni concetti di base di React come creare un componente, la sintassi JSX e le props. Se hai poca o nessuna esperienza con React, questo è l'articolo adatto a te.</p><p>Per iniziare, ecco <a href="https://www.freecodecamp.org/news/install-react-with-create-react-app/"></a><a href="https://www.freecodecamp.org/italian/news/come-installare-react-js-con-create-react-app/">come installare React</a>.</p><h2 id="cos-jsx"><strong>Cos'è JSX?</strong></h2><p>La prima cosa che capirai dopo aver installato il tuo primo progetto React è che una funzione JavaScript restituisce sempre del codice HTML:</p><pre><code class="language-jsx">function App() {
  return (
    &lt;div className="App"&gt;
      &lt;header className="App-header"&gt;
        &lt;img src={logo} className="App-logo" alt="logo" /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
        &lt;/p&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Questa è una particolare estensione della sintassi valida per React, detta JSX (JavaScript XML). Di norma, nei progetti che si occupano di front-end, manteniamo HTML, CSS e JavaScript in file separati. Tuttavia, in React funziona in modo leggermente diverso.</p><p>Nei progetti React, non creiamo file HTML separati, perché JSX ci permette di scrivere HTML e JavaScript nello stesso file, come nell'esempio precedente. Puoi comunque separare il CSS in un altro file.</p><p>All'inizio, JSX potrebbe sembrare un po' strano, ma ti ci abituerai.</p><p>JSX è molto pratico, perché possiamo eseguire qualsiasi codice JavaScript (logica, funzioni, variabili e così via) all'interno dell'HTML direttamente usando le parentesi graffe { }, in questo modo:</p><pre><code class="language-jsx">function App() {
  const text = 'Hello World';
  
  return (
    &lt;div className="App"&gt;
      &lt;p&gt; {text} &lt;/p&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Puoi anche assegnare i tag HTML alle variabili JavaScript:</p><pre><code class="language-jsx">const message = &lt;h1&gt;React is cool!&lt;/h1&gt;;</code></pre><p>O puoi restituire dell'HTML all'interno della logica JavaScript (come dei casi if-else):</p><pre><code class="language-jsx">render() {
    if(true) {
        return &lt;p&gt;YES&lt;/p&gt;;
    } else {
        return &lt;p&gt;NO&lt;/p&gt;;
    }
}</code></pre><p>Non mi soffermerò oltre sui dettagli di JSX, ma assicurati di seguire le seguenti regole quando scrivi del codice JSX:</p><ul><li>i tag HTML e dei componenti devono essere sempre chiusi &lt; /&gt;</li><li>Alcuni attributi come <strong><strong>“class”</strong></strong> diventano <strong><strong>“className” </strong></strong>(perché class fa riferimento alle classi JavaScript), <strong><strong>“tabindex” </strong></strong>diventa <strong><strong>“tabIndex” </strong>(</strong>va scritto in camelCase)</li><li>Non possiamo restituire più di un elemento HTML alla volta, quindi assicurati di racchiudere il tutto nei tag dell'elemento genitore:</li></ul><pre><code class="language-jsx">return (
  &lt;div&gt;
    &lt;p&gt;Hello&lt;/p&gt;
    &lt;p&gt;World&lt;/p&gt;
  &lt;/div&gt;
);</code></pre><ul><li>o in alternativa, tra tag vuoti:</li></ul><pre><code class="language-jsx">return (
  &lt;&gt;
    &lt;p&gt;Hello&lt;/p&gt;
    &lt;p&gt;World&lt;/p&gt;
  &lt;/&gt;
);</code></pre><h2 id="cosa-sono-i-componenti-funzionali-e-di-classe"><strong>Cosa sono i componenti funzionali e di classe?</strong></h2><p>Dopo esserti abituato alla sintassi JSX, la prossima cosa da capire è la struttura basata sui componenti di React.</p><p>Se torni a guardare il primo esempio di codice in cima al post, vedrai che il codice JSX viene restituito da una funzione. Ma la funzione App( ) non è una funzione ordinaria – in realtà è un componente. Quindi, cos'è un componente?</p><h3 id="cos-un-componente"><strong>Cos'è un componente?</strong></h3><p>Un componente è un blocco di codice indipendente e riutilizzabile che divide l'interfaccia utente in porzioni più piccole. Ad esempio, se stiamo costruendo l'interfaccia utente di Twitter con React:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/twit.png" class="kg-image" alt="twit" width="600" height="400" loading="lazy"><figcaption>I componenti del feed di Twitter</figcaption></figure><p>Piuttosto che creare l'intera interfaccia utente in un singolo file, possiamo e dovremmo dividere tutte le sezioni (evidenziate in rosso) in parti più piccole e indipendenti, ovvero in componenti.</p><p>React ha due tipi di componenti: <strong>funzionali </strong>e <strong>di classe</strong>. Vediamoli entrambi nel dettaglio.</p><h3 id="componenti-funzionali"><strong>Componenti funzionali</strong></h3><p>Il primo tipo di componente in React è il funzionale. Un componente funzionale è praticamente una funzione JavaScript/ES6 che restituisce un elemento React (JSX). Secondo la documentazione ufficiale di React, la funzione qui sotto è un componente funzionale:</p><pre><code class="language-jsx">function Welcome(props) {
  return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;;
}</code></pre><p>Alternativamente, puoi creare un componente funzionale con la definizione di una funzione freccia:</p><pre><code class="language-jsx">const Welcome = (props) =&gt; { 
  return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;; 
}</code></pre><blockquote>Questa funzione è un componente valido di React perché accetta un singolo oggetto "props" (che sta per proprietà) come argomento con dati e restituisce un elemento React. — <a href="https://reactjs.org/"><strong><strong>reactjs.org</strong></strong></a></blockquote><p>Per essere in grado di usare un componente in un secondo momento, hai bisogno di esportarlo, per poi importarlo dove necessario:</p><pre><code class="language-jsx">function Welcome(props) {
  return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;;
}

export default Welcome;</code></pre><p>Dopo averlo importato, puoi chiamare il componente come in questo esempio:</p><pre><code class="language-jsx">import Welcome from './Welcome';

function App() { 
  return (
    &lt;div className="App"&gt;
      &lt;Welcome /&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Quindi un componente funzionale di React:</p><ul><li>è una funzione JavaScript/ES6</li><li>deve restituire un elemento React (JSX)</li><li>inizia sempre con una lettera maiuscola (convenzione)</li><li>prende props come parametro se necessario</li></ul><h3 id="cosa-sono-i-componenti-di-classe"><strong>Cosa sono i componenti di classe?</strong></h3><p>Il secondo tipo di componenti sono i componenti di classe, cioè delle classi ES6 che restituiscono JSX. Qui sotto puoi vedere la stessa funzione Welcome, questa volta come componente di classe:</p><pre><code class="language-jsx">class Welcome extends React.Component {
  render() {
    return &lt;h1&gt;Hello, {this.props.name}&lt;/h1&gt;;
  }
}</code></pre><p>A differenza dei componenti funzionali, i componenti di classe devono avere un metodo addizionale render( ) per restituire JSX.</p><h3 id="perch-usiamo-i-componenti-di-classe"><strong>Perché usiamo i componenti di classe?</strong></h3><p>Utilizziamo i componenti di classe per via dello "stato". Nelle versioni più vecchie di React (precedenti alla 16.8), non era possibile usare lo stato all'interno dei componenti funzionali.</p><p>Perciò, c'era bisogno dei componenti funzionali solo per renderizzare le interfacce grafiche, mentre avremmo usato i componenti di classe per la gestione dei dati e per altre operazioni aggiuntive (come i metodi del ciclo di vita).</p><p>Tutto questo è cambiato con l'introduzione degli Hooks e adesso possiamo utilizzare gli stati anche nei componenti funzionali.</p><p>Un componente di classe:</p><ul><li>è una classe ES6, sarà un componente tramite l'uso della parola chiave ‘extends’.</li><li>accetta props (nel costruttore) se necessario</li><li>deve avere un metodo render( )<strong><strong> </strong></strong>per restituire JSX</li></ul><h2 id="cosa-sono-le-props-in-react"><strong>Cosa sono le props in React?</strong></h2><p>Un altro importante concetto dei componenti è il modo in cui comunicano. React ha degli oggetti speciali chiamati props (da proprietà) che usiamo per trasportare dati da un componente all'altro.</p><p>Ma attenzione – le props trasportano i dati soltanto in una direzione (dal componente genitore al figlio). Non è possibile per delle props trasportare dati dal figlio al genitore o a componenti dello stesso livello.</p><p>Riconsideriamo la funzione App( ) precedente per vedere come passare dei dati con le props.</p><p>Per prima cosa, dobbiamo definire una proprietà sul componente Welcome e assegnarle un valore:</p><pre><code class="language-jsx">import Welcome from './Welcome';

function App() { 
  return (
    &lt;div className="App"&gt;
      &lt;Welcome name="John"/&gt;
      &lt;Welcome name="Mary"/&gt;
      &lt;Welcome name="Alex"/&gt;
    &lt;/div&gt;
  );
}</code></pre><p>Le props sono valori personalizzati a rendono i componenti più dinamici. Dato che il componente Welcome è il figlio in questo caso, dobbiamo definire le prop sul suo genitore (App), in modo da poter passare dei valori e ottenere il risultato semplicemente accedendo al nome della prop:</p><pre><code class="language-jsx">function Welcome(props) {
  return &lt;h1&gt;Hello, {props.name}&lt;/h1&gt;;
}</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/11/props.png" class="kg-image" alt="props" width="600" height="400" loading="lazy"></figure><h3 id="le-prop-di-react-sono-davvero-utili"><strong>Le prop di React sono davvero utili</strong></h3><p>Gli sviluppatori React usano le props per passare dati e le prop sono davvero utili per svolgere questo compito. Ma per quanto riguarda la gestione dei dati? Le props vengono usate per passare dati, ma non per manipolarli. Parlerò della gestione dei dati in un prossimo articolo qui su freeCodeCamp.</p><p>Grazie per aver letto questo articolo!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come installare React.js con create-react-app ]]>
                </title>
                <description>
                    <![CDATA[ React è una delle librerie JavaScript più popolari nel campo dello sviluppo web. Come sviluppatore front-end, ho lavorato personalmente con React per i miei progetti e probabilmente continuerò a farlo in futuro. Uno dei passaggi con cui molte persone faticano è il processo di installazione/configurazione di React. Quindi partiamo dalle ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-installare-react-js-con-create-react-app/</link>
                <guid isPermaLink="false">62eb66e95cda1d06d40dc38f</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Mon, 08 Aug 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/react.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/install-react-with-create-react-app/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Install React.js with create-react-app</a>
      </p><p>React è una delle librerie JavaScript più popolari nel campo dello sviluppo web.</p><p>Come sviluppatore front-end, ho lavorato personalmente con React per i miei progetti e probabilmente continuerò a farlo in futuro. Uno dei passaggi con cui molte persone faticano è il processo di installazione/configurazione di React.</p><p>Quindi partiamo dalle basi. In questo articolo, imparerai come installare ed eseguire una applicazione React nel modo più semplice. </p><h2 id="come-scaricare-e-installare-node-js"><strong>Come scaricare e installare Node.js</strong></h2><p>Prima di tutto, avrai bisogno di NPM (o Yarn, in alternativa). In questo esempio useremo NPM.</p><p>Se non lo hai installato sul tuo sistema, puoi andare al <a href="https://nodejs.org/it/">sito web ufficiale di Node.js</a> per scaricare e installare Node, che include anche NPM (Node Package Manager).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/08/image.png 600w, https://www.freecodecamp.org/italian/news/content/images/2022/08/image.png 991w" width="991" height="646" loading="lazy"><figcaption>Il sito ufficiale di Node</figcaption></figure><p>Seleziona il pulsante "Consigliata" (Recommended for most users) e scarica la versione attuale per il tuo sistema operativo.</p><p>Dopo aver scaricato e installato Node, apri il tuo terminale/prompt dei comandi ed esegui <code>node -v</code> e <code>npm -v</code> per vedere quale versione hai.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/t1.png" class="kg-image" alt="t1" width="600" height="400" loading="lazy"></figure><p>Dovresti avere almeno la versione 5.2.0 di NPM o una delle successive perché create-react-app richiede di avere installato <a href="https://github.com/npm/npm/releases/tag/v5.2.0">NPX</a>. Se hai una versione più vecchia, puoi eseguire questo comando per aggiornarla:</p><pre><code>npm install -g npm</code></pre><h2 id="cos-create-react-app"><strong>Cos'è create-react-app?</strong></h2><p>Visto che è piuttosto complicato e richiede molto tempo, non vogliamo configurare manualmente React. create-react-app è un modo molto più semplice per effettuare automaticamente tutta la configurazione e le installazioni dei pacchetti necessari e avviare una nuova app React localmente, pronta per lo sviluppo.</p><p>Un altro vantaggio dell'utilizzo di create-react-app è che non devi avere a che fare con la configurazione di Babel o Webpack. Tutte le configurazioni necessarie verranno svolte dall'app create-react-app.</p><p>Secondo la <a href="https://reactjs.org/docs/create-a-new-react-app.html">documentazione di React</a>, create-react-app è uno dei modi supportati ufficialmente per creare un'applicazione di una pagina singola in React. Puoi trovare altri modi <a href="https://reactjs.org/docs/create-a-new-react-app.html">qui</a>.</p><h3 id="come-installare-create-react-app"><strong>Come installare create-react-app</strong></h3><p>Per installare la tua app, vai nel tuo spazio di lavoro (il desktop o una cartella) ed esegui il comando:</p><pre><code class="language-js">npx create-react-app la-mia-app</code></pre><p>Il processo di installazione potrebbe richiedere qualche minuto. Una volta fatto ciò, nel tuo spazio di lavoro dovresti vedere una cartella con il nome che hai dato alla tua app.</p><blockquote>Nota: se usi Mac e ricevi errori di permessi, usa il comando sudo.</blockquote><h3 id="come-eseguire-l-app-che-hai-creato-con-create-react-app"><strong>Come eseguire l'app che hai creato con create-react-app</strong></h3><p>Dopo che l'installazione è completata, spostati nella cartella in cui l'app è stata installata:</p><pre><code>cd la-mia-app</code></pre><p>ed esegui <code>npm start</code> per vedere la tua app live su localhost:</p><pre><code>npm start</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/10/rw.png" class="kg-image" alt="rw" width="600" height="400" loading="lazy"></figure><p>Se vedi qualcosa del genere nel tuo browser, sei pronto per lavorare con React. Congratulazioni! :)</p><p>Grazie per aver letto questo articolo!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come impostare un'immagine di sfondo in React usando il CSS in linea ]]>
                </title>
                <description>
                    <![CDATA[ Ci sono quattro modi per impostare una proprietà di stile backgroundImage usando il CSS in linea in React. Questo tutorial ti mostrerà i quattro metodi, con del codice di esempio per ognuno. Come impostare un'immagine di sfondo in React usando un URL esterno Se la tua immagine si trova da ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-impostare-una-immagine-di-background-in-react-usando-il-css-in-linea/</link>
                <guid isPermaLink="false">62a06a8e203d0c06f2188a68</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ilenia Magoni ]]>
                </dc:creator>
                <pubDate>Fri, 10 Jun 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/06/fcc-bg-image-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/react-background-image-tutorial-how-to-set-backgroundimage-with-inline-css-style/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Background Image Tutorial – How to Set backgroundImage with Inline CSS Style</a>
      </p><p>Ci sono quattro modi per impostare una proprietà di stile <code>backgroundImage</code> usando il CSS in linea in React.</p><p>Questo tutorial ti mostrerà i quattro metodi, con del codice di esempio per ognuno.</p><h2 id="come-impostare-un-immagine-di-sfondo-in-react-usando-un-url-esterno">Come impostare un'immagine di sfondo in React usando un URL esterno</h2><p>Se la tua immagine si trova da qualche parte online, puoi impostare l'immagine di sfondo del tuo elemento mettendo l'URL in questo modo:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">function App() {
  return (
    &lt;div style={{ 
      backgroundImage: `url("https://via.placeholder.com/500")` 
    }}&gt;
      Hello World
    &lt;/div&gt;
  );
}</code></pre><figcaption>Impostare l'immagine di sfondo in React con un link esterno</figcaption></figure><p>Il codice sopra renderizzerà un singolo elemento <code>div</code> con lo style <code>background-image: url(https://via.placeholder.com/500)</code> applicato ad esso.</p><h2 id="come-impostare-un-immagine-di-sfondo-in-react-dalla-tua-cartella-src">Come impostare un'immagine di sfondo in React dalla tua cartella /src</h2><p>Se crei l'applicazione usando Create React App e hai le tue immagini nella cartella <code>src/</code>, puoi prima importare l'immagine e poi piazzarla come sfondo del tuo elemento:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">import React from "react";
import background from "./img/placeholder.png";

function App() {
  return (
    &lt;div style={{ backgroundImage: `url(${background})` }}&gt;
      Hello World
    &lt;/div&gt;
  );
}

export default App;</code></pre><figcaption>Impostare l'immagine di sfondo usando un'immagine importata</figcaption></figure><p>Quando esegui il comando <code>npm start</code>, React mostrerà un errore "Failed to Compile" e fermerà il build quando l'immagine non viene trovata:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/React-failed-to-compile-image.png" class="kg-image" alt="React-failed-to-compile-image" width="600" height="400" loading="lazy"><figcaption>L'errore di React. L'immagine non è stata trovata.</figcaption></figure><p>In questo modo non mostrerai link di immagini mancanti nella tua app web. Nel codice qui sopra, il valore di <code>backgroundImage</code> è impostato usando una stringa template, che permette di incorporare un'espressione JavaScript.</p><h2 id="come-impostare-un-immagine-di-sfondo-in-react-usando-il-metodo-dell-url-relativo">Come impostare un'immagine di sfondo in React usando il metodo dell'URL relativo</h2><p>La cartella <code>public/</code> in Create React App può essere usata per aggiungere risorse statiche nella tua applicazione React. Qualsiasi file metti in questa cartella sarà accessibile online.</p><p>Puoi quindi assegnare l'URL relativo al tuo indirizzo di host per impostare l'immagine di sfondo. Ecco un esempio:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ backgroundImage: "url(/image.png)" }}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Impostare un'immagine di sfondo con un URL relativo</figcaption></figure><p>Impostando il path dell'URL a <code>/image.png</code> come nell'esempio qui sopra, il browser cercherà l'immagine di sfondo in <code>&lt;your host address&gt;/image.png</code>.</p><p>Puoi anche creare un'altra cartella dentro <code>public/</code> se vuoi organizzare le tue immagini in cartelle. Per esempio:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/Screen-Shot-2020-12-14-at-20.18.30.png" class="kg-image" alt="Screen-Shot-2020-12-14-at-20.18.30" width="600" height="400" loading="lazy"><figcaption>Creare una cartella img/ dentro la cartella public/</figcaption></figure><p>Non dimenticarti di aggiustare il valore di <code>backgroundImage</code> in <code>url(/img/image.png)</code> se decidi di creare la cartella.</p><h2 id="impostare-un-immagine-di-sfondo-in-react-usando-il-metodo-dell-url-assoluto">Impostare un'immagine di sfondo in react usando il metodo dell'URL assoluto</h2><p>Puoi anche includere l'URL assoluto usando la variabile di ambiente di Create React App <code>PUBLIC_URL</code> in questo modo:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})` 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Impostare l'immagine di sfondo usando un URL assoluto</figcaption></figure><p>Quando esegui questo sul tuo computer, gli script di React gestiscono il valore di <code>PUBLIC_URL</code>. Quando lo esegui in locale, apparirà come un URL relativo invece di un URL assoluto:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/absolute-url-background-image-1.png" class="kg-image" alt="absolute-url-background-image-1" width="600" height="400" loading="lazy"><figcaption>L'URL dell'immagine non è mostrato nel computer locale</figcaption></figure><p>L'URL assoluto sarà visto solo una volta fatto il deployment di React in una applicazione di produzione.</p><h2 id="come-impostare-un-immagine-di-sfondo-con-propriet-aggiuntive">Come impostare un'immagine di sfondo con proprietà aggiuntive</h2><p>Se vuoi personalizzare ulteriormente l'immagine di sfondo, lo puoi fare aggiungendo proprietà addizionali dopo <code>backgroundImage</code>. Ecco un esempio:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">
&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})`,
  backgroundRepeat: 'no-repeat',
  width:'250px' 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Impostare background-image con proprietà aggiuntive</figcaption></figure><p>Le proprietà impostate aggiungeranno <code>background-repeat: no-repeat</code> e <code>width: 250px</code> assieme allo stile <code>background-image</code> all'elemento <code>div</code>.</p><p>Grazie per aver letto, spero che quest'articolo ti sia stato utile. 🙂</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
