Il tutorial completo per imparare React da zero: JSX, componenti, props, state, hook, router, form, CSS-in-JS e molto altro.
Introduzione a React
React Γ¨ una libreria JavaScript open-source sviluppata da Facebook (Meta) per costruire interfacce utente interattive. Γ la tecnologia frontend piΓΉ usata al mondo ed Γ¨ alla base di app come Facebook, Instagram, WhatsApp Web e migliaia di applicazioni aziendali.
React introduce un approccio basato su componenti riutilizzabili: ogni pezzo dell'interfaccia (pulsante, menu, modulo) Γ¨ un componente indipendente con la propria logica. Questo rende il codice piΓΉ organizzato, testabile e scalabile.
π± Con React Native puoi creare app mobile iOS e Android
βοΈ React non Γ¨ un framework completo: gestisce solo la view (la UI). Per routing, state globale e altro si usano librerie aggiuntive dell'ecosistema React.
Esempio
Guida introduttiva
Il modo piΓΉ rapido per iniziare con React oggi Γ¨ usare Vite, uno strumento di build moderno che crea in pochi secondi un progetto React pronto all'uso.
Creare un progetto React con Vite
Terminale
Dopo aver eseguito questi comandi, apri il browser su http://localhost:5173 per vedere la tua app React in esecuzione.
Struttura base del progetto
File/cartella
Descrizione
src/App.jsx
Componente principale dell'app
src/main.jsx
Punto di ingresso β monta React nel DOM
index.html
HTML di base con div#root
vite.config.js
Configurazione di Vite
package.json
Dipendenze e script
π‘ In alternativa a Vite puoi usare Create React App (piΓΉ lento ma storico) oppure Next.js per app con SSR (server-side rendering).
Prima applicazione React
Il file main.jsx Γ¨ il punto di ingresso: monta il componente radice nell'elemento HTML con id="root".
React renderizza i componenti nel DOM reale attraverso il Virtual DOM: una rappresentazione in memoria dell'interfaccia. Quando lo stato cambia, React calcola solo le differenze (diff) e aggiorna solo ciΓ² che Γ¨ necessario, rendendo le app molto performanti.
Esempio β ReactDOM.createRoot
Virtual DOM vs DOM reale
Virtual DOM
DOM Reale
Oggetto JavaScript in memoria
Struttura HTML nel browser
Aggiornamenti istantanei
Aggiornamenti costosi
React calcola le differenze
Solo le differenze vengono applicate
Upgrade β React 18
React 18 (2022) ha introdotto importanti novitΓ rispetto alle versioni precedenti. La piΓΉ visibile Γ¨ la nuova API createRoot che sostituisce il vecchio ReactDOM.render.
React 17 (vecchio) vs React 18 (nuovo)
NovitΓ di React 18
Concurrent Mode: React puΓ² interrompere e riprendere il rendering per mantenere l'app reattiva
Automatic Batching: gli aggiornamenti di stato multipli vengono raggruppati automaticamente
useTransition e useDeferredValue: hook per gestire transizioni UI non urgenti
Suspense migliorato: supporto per il data fetching asincrono
ES6 in React
React fa ampio uso delle funzionalitΓ moderne di JavaScript (ES6+). Conoscerle Γ¨ fondamentale per scrivere codice React idiomatico.
Arrow functions, destructuring, spread
π‘ Lo spread operator Γ¨ molto usato in React per aggiornare lo state in modo immutabile senza modificare l'oggetto originale.
JSX β Introduzione
JSX (JavaScript XML) Γ¨ un'estensione della sintassi JavaScript che permette di scrivere markup simile all'HTML direttamente nel codice JS. Babel lo compila in chiamate React.createElement().
JSX vs createElement
Regole fondamentali JSX
Ogni componente deve restituire un solo elemento radice (usa un <div> o un Fragment <>...</>)
I tag vanno sempre chiusi: <br />, <img />
Usa className invece di class
Usa htmlFor invece di for
JSX β Espressioni
In JSX puoi inserire qualsiasi espressione JavaScript tra parentesi graffe {}. Puoi usare variabili, operazioni matematiche, chiamate a funzioni e operatori ternari.
Espressioni JSX
π Le parentesi graffe accettano solo espressioni, non istruzioni (if, for, ecc.). Per la logica usa operatori ternari o funzioni esterne.
JSX β Attributi
Gli attributi JSX seguono la convenzione camelCase. Molti attributi HTML hanno nomi diversi in JSX per evitare conflitti con parole riservate JavaScript.
Attributi JSX
HTML
JSX
class
className
for
htmlFor
tabindex
tabIndex
onclick
onClick
style="color:red"
style={{ color: 'red' }}
JSX β If Statements
In JSX non puoi usare direttamente if dentro le parentesi graffe, ma hai tre alternative comuni:
Condizioni in JSX
Componenti
I componenti sono i mattoncini di React. Ogni componente Γ¨ una funzione (o classe) che riceve dati in input (props) e restituisce JSX. I componenti si compongono tra loro per costruire interfacce complesse.
Componenti funzionali
π‘ I nomi dei componenti devono iniziare con la lettera maiuscola: React usa questa convenzione per distinguere i componenti custom dai tag HTML nativi.
Class Components
Prima degli hook (React 16.8), i componenti con stato dovevano essere scritti come classi. Oggi si preferiscono i componenti funzionali con hook, ma Γ¨ importante conoscere le classi per lavorare su codice legacy.
Class Component
Ciclo di vita dei Class Components
Metodo
Quando viene chiamato
componentDidMount
Dopo il primo render (mounting)
componentDidUpdate
Dopo ogni aggiornamento dello state/props
componentWillUnmount
Prima che il componente venga rimosso
render
Ad ogni render (obbligatorio)
Props
Le props (proprietΓ ) sono il meccanismo con cui un componente genitore passa dati a un componente figlio. Le props sono immutabili: il figlio puΓ² leggerle ma non modificarle.
Passare e ricevere props
π Le props fluiscono sempre dall'alto verso il basso (dal genitore al figlio). Per passare dati in senso contrario si usano le callback.
Props β Destructuring
Il destructuring ES6 rende il codice piΓΉ pulito: invece di scrivere props.nome, puoi estrarre le proprietΓ direttamente nei parametri della funzione.
Destructuring delle props
π‘ Puoi definire valori di default direttamente nel destructuring: { colore = "blu" }.
Props β Children
La prop speciale children contiene tutto ciΓ² che viene scritto tra i tag di apertura e chiusura del componente. Permette di creare componenti "contenitore" generici.
Props children
Eventi
In React gli eventi si gestiscono con attributi camelCase e si passa una funzione handler (non una stringa). React utilizza un sistema di eventi sintetici che normalizza il comportamento cross-browser.
Gestire eventi
Evento
Descrizione
onClick
Clic del mouse
onChange
Cambiamento valore input
onSubmit
Invio form
onFocus / onBlur
Focus / perdita focus
onKeyDown / onKeyUp
Pressione tasto
onMouseEnter / onMouseLeave
Mouse sopra/fuori
Rendering condizionale
React permette di mostrare o nascondere elementi in base a condizioni. Le tecniche principali sono l'operatore ternario, l'operatore && e le variabili JSX.
Rendering condizionale
Liste
Per renderizzare liste di elementi si usa il metodo .map(). Ogni elemento della lista deve avere una prop key unica per aiutare React a identificare gli elementi nel Virtual DOM.
Renderizzare una lista
β οΈ Non usare l'indice dell'array come key se l'ordine degli elementi puΓ² cambiare: usa sempre un ID univoco e stabile.
Form
In React i form si gestiscono con i componenti controllati: il valore dell'input è legato allo state, e ogni modifica aggiorna lo state tramite onChange. React diventa così la "fonte di verità " per i dati del form.
Input controllato
Form β Submit
Per gestire l'invio del form si usa l'evento onSubmit. Γ importante chiamare e.preventDefault() per impedire il ricaricamento della pagina.
Form con submit
Form β Textarea
In React, <textarea> funziona come un input normale: il valore Γ¨ gestito tramite la prop value e onChange.
Textarea controllata
Form β Select
Un <select> controllato usa la prop value sul tag select (non selected sull'option).
Select controllata
Form β Input multipli
Con piΓΉ input puoi gestire lo stato con un unico oggetto. Usa l'attributo name per identificare ogni campo e aggiornare la proprietΓ corrispondente nello state.
Form con input multipli
Form β Checkbox
Per le checkbox si usa la prop checked (booleano) invece di value.
Checkbox controllata
Form β Radio
I radio button si gestiscono confrontando il valore dello state con il value di ogni radio.
Radio button controllato
Portals
I React Portals permettono di renderizzare un componente figlio in un nodo DOM diverso dal genitore. Sono utili per modali, tooltip e dropdown che devono "uscire" dal flusso DOM normale.
ReactDOM.createPortal
π In index.html aggiungi <div id="modal-root"></div> accanto a <div id="root">.
Suspense
React.Suspense permette di mostrare un contenuto di fallback (es. uno spinner) mentre un componente figlio viene caricato in modo asincrono. Γ usato con React.lazy() per il code splitting.
React.lazy e Suspense
π‘ Suspense migliora le performance dell'app: i bundle vengono scaricati solo quando l'utente naviga verso quella sezione (code splitting).
CSS Styling in React
React offre diversi approcci per aggiungere stili ai componenti. Ogni approccio ha i suoi punti di forza.
Stili inline con oggetto
Approccio
Pro
Contro
CSS esterno
Familiare, semplice
Nomi globali, conflitti
Stili inline
Dinamici, nessun file extra
No pseudo-classi, no media query
CSS Modules
Scoping locale, no conflitti
Setup richiesto
CSS-in-JS
Completamente dinamico
Dipendenza extra, overhead
Sass
Variabili, nesting, potente
Compilazione richiesta
CSS Modules
I CSS Modules sono file CSS normali con l'estensione .module.css. Vite e Create React App li supportano nativamente. I nomi delle classi vengono trasformati in identificatori univoci, eliminando i conflitti.
Bottone.module.css + Bottone.jsx
π Vite trasforma styles.bottone in un nome univoco come Bottone_bottone__3xKj1, garantendo l'isolamento degli stili.
CSS-in-JS
Le librerie CSS-in-JS come styled-components e Emotion permettono di scrivere CSS direttamente nel file JavaScript, con pieno supporto a props dinamiche, temi e pseudo-classi.
styled-components
React Router
React Router Γ¨ la libreria standard per il routing nelle app React. Permette di navigare tra "pagine" senza ricaricare il browser (Single Page Application).
React Router v6 β Setup base
π‘ Usa useNavigate() per navigare via codice e useParams() per leggere i parametri dinamici dell'URL (/prodotti/:id).
Transitions β useTransition
L'hook useTransition (React 18) permette di marcare alcuni aggiornamenti di stato come "non urgenti". React dΓ prioritΓ agli aggiornamenti urgenti (input utente) e posticipa quelli secondari, mantenendo l'interfaccia reattiva.
useTransition
Forward Ref
React.forwardRef permette a un componente figlio di esporre un riferimento DOM al genitore. Utile per componenti di input personalizzati che devono essere controllati dall'esterno.
forwardRef
Higher-Order Components (HOC)
Un HOC Γ¨ una funzione che riceve un componente e ne restituisce uno nuovo con funzionalitΓ aggiuntive. Γ un pattern per il riuso della logica tra componenti (oggi spesso sostituito dagli hook).
HOC β withAuth
Sass in React
Sass Γ¨ un pre-processore CSS che aggiunge variabili, nesting, mixin e funzioni al CSS. In Vite basta installare il pacchetto sass e usare l'estensione .scss.
Sass con React
Hook β useState
useState Γ¨ l'hook piΓΉ fondamentale: permette di aggiungere stato locale a un componente funzionale. Restituisce il valore corrente e una funzione per aggiornarlo.
useState β Contatore
π‘ Quando il nuovo stato dipende da quello precedente, usa la forma funzionale: setCount(c => c + 1). Evita race condition in aggiornamenti multipli.
Hook β useEffect
useEffect gestisce gli effetti collaterali: fetch di dati, sottoscrizioni a eventi, aggiornamento del DOM. Sostituisce componentDidMount, componentDidUpdate e componentWillUnmount.
useEffect β fetch dati
Array dipendenze
Comportamento
Omesso
Eseguito dopo ogni render
[] vuoto
Solo al mount (una volta)
[val]
Quando val cambia
Hook β useContext
useContext consente di condividere dati tra componenti senza passare props a ogni livello (prop drilling). Il Context Γ¨ ideale per temi, lingua, utente autenticato.
useContext β Tema
Hook β useRef
useRef restituisce un oggetto mutabile con una proprietΓ .current. Γ usato per accedere direttamente agli elementi DOM e per conservare valori che non devono causare un re-render quando cambiano.
useRef β DOM e timer
Hook β useReducer
useReducer Γ¨ un'alternativa a useState per stato complesso. Si ispira al pattern Redux: un reducer riceve lo stato corrente e un'azione, e restituisce il nuovo stato.
useReducer β Contatore avanzato
π‘ Preferisci useReducer quando hai molte variabili di stato correlate o logica di transizione complessa.
Hook β useCallback
useCallback restituisce una versione memoizzata di una funzione callback. Γ utile per ottimizzare le performance quando si passa una callback a componenti figli profondi: evita che il figlio si re-renderizzi inutilmente ad ogni render del genitore.
useCallback
Hook β useMemo
useMemo memoizza il risultato di un calcolo costoso: lo ricalcola solo quando le dipendenze cambiano. Γ utile per filtrare/ordinare grandi liste o calcoli pesanti.
useMemo β Filtro lista
Custom Hooks
I Custom Hook sono funzioni JavaScript che iniziano con use e possono chiamare altri hook. Permettono di estrarre e riutilizzare logica stateful tra piΓΉ componenti.
Custom Hook β useFetch
π‘ I Custom Hook sono il modo moderno per condividere logica in React. Seguono sempre la convenzione use all'inizio del nome.
Editor online β Prova React
React richiede un ambiente di build (Vite, Next.js) per essere eseguito. Puoi sperimentare immediatamente online con questi strumenti gratuiti:
π StackBlitz β Ambiente Vite+React completo nel browser
π¦ CodeSandbox β IDE online con template React
βοΈ Gli esempi in questo corso mostrano codice JSX con sintassi colorata. L'editor integrato ti permette di leggerli e modificarli β usa uno dei link sopra per eseguirli.
Quiz React
Metti alla prova le tue conoscenze con queste domande:
β Cosa restituisce useState(0)? R: Un array con il valore corrente (0) e la funzione di aggiornamento: [0, setStato].
β Qual Γ¨ la differenza tra useCallback e useMemo? R:useCallback memoizza una funzione; useMemo memoizza il risultato di un calcolo.
β Cosa succede se non si fornisce una key in una lista React? R: React non riesce a tracciare efficientemente gli elementi β warning in console e possibili bug di rendering.
β Quando viene eseguito il cleanup di useEffect? R: Prima che il componente venga smontato e prima che l'effetto venga rieseguito (se le dipendenze cambiano).
β Cos'Γ¨ il "prop drilling"? R: Passare props attraverso molti livelli di componenti annidati. Si risolve con Context o Redux.
β Quali hook sono disponibili solo in componenti funzionali? R: Tutti gli hook React (useState, useEffect, ecc.) β non si possono usare nelle classi.
Esercizi pratici React
Esercizio 1 β Lista della spesa
Crea un'app dove l'utente puΓ² aggiungere elementi a una lista e rimuoverli con un clic.
Soluzione
Esercizio 2 β Cronometro con useRef
Crea un cronometro con i pulsanti Avvia, Pausa e Reset. Usa useRef per conservare l'ID dell'intervallo senza causare re-render.
Esercizio 3 β Fetch con useFetch
Crea un Custom Hook useFetch e usalo per visualizzare una lista di post da https://jsonplaceholder.typicode.com/posts.
Esercizio 4 β Tema scuro/chiaro
Implementa un toggle tema scuro/chiaro usando useContext. Il tema deve essere accessibile in tutta l'app senza prop drilling.
Programma del corso React
Modulo
Argomenti
1 β Basi React
Intro, Vite setup, JSX, componenti, props, rendering condizionale, liste
2 β State e Form
useState, eventi, form controllati, input multipli, checkbox, radio, select
React Router v6: routing SPA completo con parametri dinamici
6
useCallback, useMemo, React.memo β ottimizzazione delle performance
7
Custom Hook, CSS Modules, Sass, styled-components
8
Progetto completo: app con routing, context, fetch API, form, stile
π‘ Dopo le basi React, studia Next.js per SSR/SSG oppure React Native per le app mobile β entrambi basati sugli stessi principi che hai imparato qui.
Domande da colloquio React
π¬ Differenza tra stato locale e stato globale? β Lo stato locale (useState) Γ¨ isolato nel componente. Lo stato globale (Context, Redux, Zustand) Γ¨ condiviso tra piΓΉ componenti.
π¬ Quando usare useEffect? β Per effetti collaterali: fetch dati, sottoscrizioni, interazioni con API esterne, aggiornamenti del titolo della pagina.
π¬ Cosa sono le Controlled Components? β Componenti form il cui valore Γ¨ gestito dallo stato React, non dal DOM. React Γ¨ la fonte di veritΓ per il valore.
π¬ Differenza tra useCallback e useMemo? β useCallback memoizza una funzione; useMemo memoizza il risultato di un calcolo. Entrambi evitano rielaborazioni inutili.
π¬ Cos'Γ¨ il Context e quando usarlo? β Permette di passare dati in profonditΓ senza prop drilling. Adatto per temi, lingua, autenticazione. Non Γ¨ sostituto di Redux per stato complesso e frequentemente aggiornato.
Bootcamp React β Progetto finale
Costruisci un'app completa che integra tutti i concetti del corso:
π Progetto: App Gestione Note
π CRUD completo: Crea, leggi, modifica ed elimina note
π Ricerca e filtro: Filtra le note con useMemo per performance
π Tema scuro/chiaro: Toggle con useContext
πΎ Persistenza: Salva le note in localStorage con useEffect
π Routing: Pagina lista, pagina dettaglio nota, pagina nuova nota
π¨ Stile: CSS Modules con supporto al tema scuro
πͺ Custom Hooks: useLocalStorage, useSearch
π― Sfida avanzata
Aggiungi autenticazione simulata con Context (login/logout), condividi lo stato utente in tutta l'app e proteggi le route private redirigendo al login se non autenticato.
Risorse consigliate per continuare
π Next.js: React con SSR, routing file-based, API routes
π¦ Redux Toolkit: Gestione stato globale per app complesse
π― React Query / TanStack Query: Gestione asincrona dei dati con cache
π± React Native: Stesse basi React per app iOS e Android
π§ͺ React Testing Library: Testing dei componenti React
Certificazione React
Padroneggiare React Γ¨ uno dei requisiti piΓΉ richiesti nelle offerte di lavoro frontend. Ecco come valorizzare le tue competenze:
Certificazione / Percorso
Ente / Piattaforma
Note
React Certificate
W3Schools
Base, ottimo per iniziare il CV
Meta Front-End Developer
Coursera (Meta)
Include React β riconosciuto da Meta
React - The Complete Guide
Udemy (Maximilian)
Corso piΓΉ popolare, certificato di completamento
Frontend Developer Career Path
Scrimba
Interattivo, include React
Progetto su GitHub
Portfolio personale
La migliore prova pratica per i recruiter
Come prepararsi al colloquio
ποΈ Costruisci 2-3 progetti completi visibili su GitHub
β‘ Conosci bene gli hook: useState, useEffect, useContext, useRef
π Impara Next.js: molte aziende lo usano con React
π§ͺ Impara le basi del testing con React Testing Library
π Studia i concetti: Virtual DOM, reconciliation, re-render, memoization
Conclusione β E ora?
Hai completato il corso React! Hai imparato JSX, i componenti funzionali, le props, tutti i principali hook (useState, useEffect, useContext, useRef, useReducer, useCallback, useMemo), i Custom Hook, React Router, la gestione dei form, CSS Modules, CSS-in-JS, Sass, Portals, Suspense e i pattern avanzati come HOC e forwardRef.
I tuoi prossimi passi
ποΈ Costruisci un progetto reale: un'app todo, un portfolio, un e-commerce semplice
β‘ Studia Next.js: aggiunge routing, SSR e API routes a React
π¦ Esplora Redux Toolkit per gestire stato globale complesso
π± Prova React Native se ti interessano le app mobile
π§ͺ Impara il testing con Jest e React Testing Library
Crea un'app React completa con almeno: un'interfaccia con piΓΉ "pagine" gestite da React Router, stato condiviso tramite Context, fetch di dati da una API pubblica, un form con validazione, e CSS Modules per lo stile. Pubblicala su Vercel o Netlify e inseriscila nel tuo portfolio!