Istituto Tecnico Tecnologico “B. Pascal”
Repository del corso: GitHub
Totale: 10 ore, divise in 5 lezioni
Martedì Venerdì 04/03 07/03 11/03 ;( 18/03 21/0325/03 -
Tutte le lezioni si svolgono dalle 14:30 alle 16:30 in L1.
(verrà introdotto nelle slide successive)
Consultabile nel README.md della repository di riferimento.
ChatGPT (o simili) sanno risolvere molto bene i nostri problemi.
divfetch API per richieste sempliciUtilizzare ChatGPT (o simili). Troppo di aiuto.
(e di ulteriore aiuto)
Utilizzare strumenti che ti guidano nella risoluzione di un problema.

Richiede login con
GitHub
Linguaggi fondamentali: HTML, CSS e JavaScript
Non è un linguaggio di programmazione!

nome="valore" che specifica alcune proprietà dell’elemento<!DOCTYPE html> <!-- Dichiaro il tipo di documento -->
<html>
<!-- Parte di metadati della pagina -->
<head>
<title>Il mio bellissimo sito</title>
</head>
<!-- Contenuto della pagina -->
<body>
<p>Lorem Ipsum Ipse Dixit</p>
<a href="www.google.com">Mi sento fortunato</a>
</body>
</html>
Rappresentazione ad albero del contenuto di una pagina HTML



Alcuni tag fondamentali:
<img src="link-to-img" alt="">
src: percorso dell’immagine (salvata nel filesystem o sul web)alt: testo alternativo (mostrato quando l’immagine non viene caricata correttamente)Alcuni tag fondamentali:
<a href="www.google.com" target="_blank">Clicca qui</a>
href: URL del tag.target: specifica dove deve essere aperto quel link — _blank indica “in una nuova tab”.href, target, src, alt…)classidstyledata-class vs id
class: identifica un gruppo di elementi a cui voglio attribuire caratteristiche comuni.id: identifica un singolo elemento della mia pagina.Entrambi permettono di interagire con il documento HTML tramite fogli di stile o script esterni.
Non è un linguaggio di programmazione!

style del tag che voglio stilare<head> dal tag <style><head> dal tag <style><head> dal tag <link>...
<header style="color:blue;">
<h1>Monsters and Co.</h1>
</header>
...
<head>...
<head>
<style type="text/css">
header {
color: blue;
}
</style>
</head>
<body>
<header>
<h1>Monsters and Co.</h1>
</header>
</body>
...
index.html |
styles.css |
|---|---|
|
|
index.html |
styles.css |
|---|---|
|
|
selettore { proprietà: valore; }
| # | specifica | esempio |
selettore |
a chi applicare le regole di stile | div, .nav-link... |
proprietà |
caratteristica di stile assegnabile ad un elemento | margin, padding... |
Più utilizzati
| Tipologia | Selettore |
|---|---|
| universale | * |
| di tipo | E |
| di prossimità | E{ ,>,+,~}F |
| di classe | E{.,#}main-title |
Un pelo meno utilizzati
| Tipologia | Selettore |
|---|---|
| di pseudo-classi | E:link, E:hover |
| di pseudo-classi strutturali | E:first-child, E:nth-child(n) |
| di pseudo-elementi | E:before, E:after |
| di attributi | E[attr] |
<div id="provaID"></div>
div#provaID{ background-color: red; } div.provaClasse{ background-color: blue; } div{ background-color: green; }
Di quale colore sarà lo sfondo del div?
In ordine decrescente di importanza
!importantfornisce max. priorità:p { font-size: 3px !important }
Ogni elemento è definito da una scatola (box) all’interno della quale si trova il contenuto.

Sistema di suddivisione e distribuzione dello spazio che favorisce adattabilità alle dimensioni dello schermo, anche quando la dimensione degli elementi da disporre non è conosciuta a priori.
Utilizzata da Bootstrap!

Creazione di oggetti
| Classe | Prototipo | JSON Notation |
|---|---|---|
![]() |
![]() |
![]() |
<script> contenuto nella pagina HTML.
<script type="text/javascript">
…codice JS
</script>
<script src="script_esterno.js"> </script>
<input type="button" onclick="alert('Ciao!')"…/>
<a href="javascript:nome_funzione()"> Clicca qui!</a>
Cheatsheet — sintassi
Link al cheatsheet
Cosa interessa a noi: dichiarazione di una variabile
const vector = []
|
vector è costante
|
let vector = []
|
vector non è costante
|
Esiste anche
var, ma è bandita da questo corso.
Vantaggi di React, tecnologie adottate

Docs: react.dev

Struttura / insieme di regole a cui uno sviluppatore deve attenersi per costruire un’applicazione.
Insieme di funzioni messe a disposizione dello sviluppatore per risolvere un problema.
useState(), useEffect(), useContext()react-routerflickrAPIProgetto PCTO — 5F, A.S. 2022/23
proff. Tappi Francesco, Tonetti Tiberio

Versione riadattata al corso:

vite, sguardo alla struttura di un progetto template
Controlla la versione installata con:
node --versionoppure installane una da https://nodejs.org/en
1) Esegui
npm create vite@latest
sul terminale e segui le istruzioni!
Puoi aggiungere
<proj_name> -- --template reactper saltare i passaggi di setup.
2) Esegui
npm install
per installare tutte le dipendenze necessarie al progetto.
3) Esegui
npm run dev
per avviare il progetto!
All’interno della cartella del progetto appena creato, apri il terminale e digita
npm i bootstrap@5.3.3
[proj_name]/src/main.jsx
import 'bootstrap/dist/css/bootstrap.min.css'
import 'bootstrap/dist/js/bootstrap.bundle.min'
...
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
...
JSX, props, Thinking in React
![]() |
![]() |
| HTML | JavaScript |
![]() |
![]() |
Sidebar.jsx |
Form.jsx |
Insieme di codici markup che possono essere ‘cosparsi di interattività’.
Insieme di funzionalità che possono essere ‘cosparse di markup’.
“JavaScript XML”
JavaScript + HTML
Estensione di ogni file in cui si definisce un componente
Navbar.jsx, Footer.jsx…
Dichiarazione di componenti
PascalCase
altrimenti non funzionano!
Le funzioni che restituiscono del JSX devono restituire sempre e solo 1 elemento di root.
![]() |
![]() |
| Tag HTML | Frammenti |
Chiudi sempre qualsiasi tag HTML!
| HTML-like | React-like |
|---|---|
<img> |
<img/> |
<br> |
<br/> |
<li> |
<li/> |
Usa quasi sempre il camelCase nelle proprietà!
| HTML-like | React-like |
|---|---|
|
|
Usa quasi sempre il camelCase nelle proprietà!

JSX viene convertito in un oggetto JavaScript.
| from | to |
|
|
Core feature di React
Blocchi di UI indipendenti e riutilizzabili.
| Class Components | Functional Components |
|---|---|
![]() |
![]() |
| Class | Functional |
|---|---|
Definiti in una classe che estende React.Component; devono definire la UI nel metodo render() |
Funzione JavaScript che restituisce del JSX |
| Componenti Stateful: logica + stato | Componenti Stateless (Stateful con Hooks) |
| ✅ gestione del ciclo di vita. | ❌ gestione del ciclo di vita. |
![]() |
![]() |

“Nascita”, aggiornamento e “morte”
3 fasi:
props o lo stato di un componente cambiaFunzioni ereditabili dalla classe
React.Component
componentDidMount()
componentDidUpdate(prevProps, prevState)
componentWillUnmount()
Simulato grazie all’hook useEffect()
useEffect(() => {...}, [])
useEffect(() => {...}, [yourDependency])
useEffect(() => { return () => {...} })
Esempio in react-examples
Mostro un componente in base ad una condizione booleana.
&& operator
Esempio in react-examples
Come gestisco onClick(), onSubmit() o altri tipi di eventi lanciati da elementi del DOM?
Esempio in react-examples
Utilizzo l’hook useState().
Particolare funzione che non restituisce JSX, ma permette di connettersi con una funzionalità di un componente.
Dall’inglese ‘hook into’ — connettersi
N.B.B. (nota bene benissimo): Tutti gli hook devono iniziare con
use
useState(), useContext(), useEffect(), useRef()…
Possono essere anche custom!
useState(): anatomiaimport { useState } from "react"
const [ index, setIndex ] = useState(0)
const [ name, setName ] = useState("")
N.B.S.B. (nota bene super bene): usa il setter fornito per modificare lo stato!
Solitamente si scrive
const [ something, setSomething ] = useState(...)
set per il secondo elemento di ritorno!
react-router
Reference: reactrouter.com
Funzionalità non prevista di default.
Dobbiamo implementarla attraverso strumenti esterni!
react-router
[...] React Router is a simple and declarative library for routing. Its only job will be matching the URL to a set of components, providing access to URL data, and navigating around the app. [...]
Installazione
In un terminale aperto dentro al progetto, eseguire:
npm install react-router
Setup
2 fasi:
In cima alla nostra applicazione, dobbiamo posizionare un componente <BrowserRouter>

(1) Dichiarazione delle routes.
All’interno dell’entry point della nostra applicazione, devo dichiarare l’elenco delle possibili routes.

<Route> e <Routes>
<Route>: “strada” all’interno della mia applicazione, comprende
path)element)<Route> e <Routes>
<Route>: può essere composta!

<Route> e <Routes>
<Routes>: elenco di <Route> dell’applicazione

(2) Navigazione
3 possibilità (2 molto simili):
<Link><NavLink>useNavigate()Guida di riferimento — reactrouter.com/start/declarative/navigating

Processo di recupero di dati.
Il nostro caso: Flickr

Il nostro caso: Flickr
Servizio predecessore di Instagram, Unsplash… nato nel 2004 per organizzare e condividere foto.
Il nostro caso: FlickrAPI

Insieme di operazioni generalmente asincrone.
Nel moderno JavaScript, vengono gestite tramite paradigma delle Promise.
Promise
“Proxy” per un oggetto il cui valore non è conosciuto al momento della creazione.
Come un metodo sincrono restituisce un valore, una funzione asincrona ritorna una Promise per fornire un valore in un determinato momento del futuro.
Promise

web-basics/js/promises.js
Un esempio

web-basics/js/promises.js
Un esempio

web-basics/js/promises.js
Come aggancio le callback resolve() e reject()?

web-basics/js/promises.js
Esempio di fetch() API — con dati di esempio

La pura logica del fetching è responsabilità di JavaScript. In React:
pending delle Promise ed eventuali errori.Supponiamo di avere una funzione fetchPhotos() che prende due parametri — url e pictureUrlFormatter — e che restituisce una Promise contenente un array di oggetti HTMLImageElement

(1) ottimizzazione delle richieste dei dati
Chiamare questa promise in un componente è immediato per 1 volta, ma se il fetch viene eseguito ad ogni re-render l’applicazione potrebbe subire rallentamenti.
(1) ottimizzazione delle richieste dei dati
Dobbiamo salvare in una cache il primo risultato, e ricalcolarlo solo quando strettamente necessario.
(1) ottimizzazione delle richieste dei dati
Soluzione: useMemo()!
Hook di React per memorizzare il risultato di un calcolo dispendioso.
Anatomia di useMemo()
reactuseMemo()
(2) gestione degli stati pending e rejected di una Promise
Obiettivo: Vogliamo visualizzare il caricamento delle risorse e segnalare un eventuale errore avvenuto durante la richiesta.
(2) gestione degli stati pending e rejected di una Promise
Come? Innanzitutto, il componente che incaricato a mostrare i dati ricevuti deve poter ricevere una promise come prop.

Il contenuto di questa promise deve essere letto dal componente tramite Hook use().
use()è una novità di React v19!
Reference: Official Docs

Ricordati di
'use-client'!
`
Così facendo, il componente è pronto.
La nostra applicazione utilizza il componente Gallery immediatamente dentro ad App.
Muoviamoci quindi su
App.
È dentro ad App che richiamiamo la promise e la memorizziamo con useMemo()

Posso ricoprire il componente Gallery con un componente nativo di React chiamato Suspense

Posso ricoprire il tutto con un componente ErrorBoundary
Non è direttamente presente nella libreria
react, è necessario installare il pacchettoreact-error-boundaryper poterlo utilizzare
npm i react-error-boundary

https://react.dev/learn/thinking-in-react



Keep it D.R.Y.!
Don’t Repeat Yourself
Make data flow bidirectional.
Link al Google Form