Componenti e Props
These docs are old and wonβt be updated. Go to react.dev for the new React docs.
These new documentation pages teach modern React and include live examples:
I Componenti ti permettono di suddividere la UI (User Interface, o interfaccia utente) in parti indipendenti, riutilizzabili e di pensare ad ognuna di esse in modo isolato. Questa pagina offre una introduzione al concetto dei componenti. Puoi trovare invece informazioni dettagliate nella API di riferimento dei componenti.
Concettualmente, i componenti sono come funzioni JavaScript: accettano in input dati arbitrari (sotto il nome di βpropsβ) e ritornano elementi React che descrivono cosa dovrebbe apparire sullo schermo.
Funzioni e Classi Componente
Il modo piΓΉ semplice di definire un componente Γ¨ quello di scrivere una funzione JavaScript:
function Ciao(props) {
return <h1>Ciao, {props.nome}</h1>;
}
Questa funzione Γ¨ un componente React valido in quanto accetta un oggetto parametro contenente dati sotto forma di una singola βpropsβ (che prende il nome da βpropertiesβ in inglese, ossia βproprietΓ β) che Γ¨ un oggetto parametro avente dati al suo interno e ritorna un elemento React. Chiameremo questo tipo di componenti βcomponenti funzioneβ perchΓ© sono letteralmente funzioni JavaScript.
Puoi anche usare una classe ES6 per definire un componente:
class Ciao extends React.Component {
render() {
return <h1>Ciao, {this.props.nome}</h1>;
}
}
I due componenti appena visti sono equivalenti dal punto di vista di React.
Le Classi e i Componenti Funzione hanno funzionalitΓ aggiuntive che verranno discusse in dettaglio nelle prossime sezioni.
Renderizzare un Componente
In precedenza, abbiamo incontrato elementi React che rappresentano tags DOM:
const elemento = <div />;
Comunque, gli elementi possono rappresentare anche componenti definiti dallβutente:
const elemento = <Ciao nome="Sara" />;
Quando React incontra un elemento che rappresenta un componente definito dallβutente, passa gli attributi JSX ed i figli a questo componente come un singolo oggetto. Tale oggetto prende il nome di βpropsβ.
Ad esempio, il codice seguente renderizza il messaggio βCiao, Saraβ nella pagina:
function Ciao(props) { return <h1>Ciao, {props.nome}</h1>;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
const elemento = <Ciao nome="Sara" />;root.render(elemento);
Ricapitoliamo cosa succede nellβesempio:
- Richiamiamo
root.render()
con lβelemento<Ciao nome="Sara" />
. - React chiama a sua volta il componente
Ciao
con{nome: 'Sara'}
passato in input come props. - Il nostro componente
Ciao
ritorna un elemento<h1>Ciao, Sara</h1>
come risultato. - React DOM aggiorna efficientemente il DOM per far sì che contenga
<h1>Ciao, Sara</h1>
.
Nota Bene: Ricordati di chiamare i tuoi componenti con la prima lettera in maiuscolo.
React tratta i componenti che iniziano con una lettera minuscola come normali tags DOM. per esempio,
<div />
rappresenta un tag HTML div,<Ciao />
rappresenta invece un componente e richiedeCiao
allβinterno dello scope.Per saperne di piΓΉ riguardo questa convenzione, leggi JSX In Dettaglio.
Comporre Componenti
I componenti possono far riferimento ad altri componenti nel loro output. CiΓ² permette di utilizzare la stessa astrazione ad ogni livello di dettaglio. Un bottone, un form, una finestra di dialogo, una schermata: nelle applicazioni React, tutte queste cose di solito sono espresse come componenti.
Per esempio, possiamo creare un componente App
che renderizza Ciao
tante volte:
function Ciao(props) {
return <h1>Ciao, {props.nome}</h1>;
}
function App() {
return (
<div>
<Ciao nome="Sara" /> <Ciao nome="Cahal" /> <Ciao nome="Edite" /> </div>
);
}
Normalmente, le nuove applicazioni React hanno un singolo componente chiamato App
al livello piΓΉ alto che racchiude tutti gli altri componenti. Ad ogni modo, quando si va ad integrare React in una applicazione giΓ esistente, Γ¨ bene partire dal livello piΓΉ basso e da piccoli componenti come ad esempio Bottone
procedendo da lì fino alla cima della gerarchia della vista.
Estrarre Componenti
Non aver paura di suddividere i componenti in componenti piΓΉ piccoli.
Ad esempio, considera questo componente Commento
:
function Commento(props) {
return (
<div className="Commento">
<div className="InfoUtente">
<img className="Avatar"
src={props.autore.avatarUrl}
alt={props.autore.nome}
/>
<div className="InfoUtente-nome">
{props.autore.nome}
</div>
</div>
<div className="Commento-testo">
{props.testo}
</div>
<div className="Commento-data">
{formatDate(props.data)}
</div>
</div>
);
}
Esso accetta come props: autore
(un oggetto), testo
(una stringa) e data
(sotto forma di oggetto Date) al fine di renderizzare un commento in un sito di social media, come Facebook.
Un componente scritto in quel modo, con codice molto annidato, Γ¨ difficile da modificare. Per lo stesso motivo, non si possono riutilizzare con facilitΓ parti dello stesso. Procediamo quindi ad estrarre qualche componente.
Per cominciare, estraiamo Avatar
:
function Avatar(props) {
return (
<img className="Avatar" src={props.utente.avatarUrl} alt={props.utente.nome} /> );
}
Avatar
non ha bisogno di sapere che viene renderizzato allβinterno di un Commento
. Ecco perchΓ© abbiamo dato alla sua prop un nome piΓΉ generico: utente
al posto di autore
.
Consigliamo di dare il nome alle props dal punto di vista del componente piuttosto che dal contesto in cui viene usato.
Adesso possiamo semplificare un poβ il componente Commento
:
function Commento(props) {
return (
<div className="Commento">
<div className="InfoUtente">
<Avatar utente={props.autore} /> <div className="InfoUtente-nome">
{props.autore.nome}
</div>
</div>
<div className="Commento-testo">
{props.testo}
</div>
<div className="Commento-data">
{formatDate(props.data)}
</div>
</div>
);
}
Andiamo ora ad estrarre il componente InfoUtente
che renderizza un Avatar
vicino al nome dellβutente:
function InfoUtente(props) {
return (
<div className="InfoUtente"> <Avatar utente={props.utente} /> <div className="InfoUtente-nome"> {props.utente.nome} </div> </div> );
}
CiΓ² ci permette di semplificare Commento
ancora di piΓΉ:
function Commento(props) {
return (
<div className="Commento">
<InfoUtente utente={props.autore} /> <div className="Commento-testo">
{props.testo}
</div>
<div className="Commento-data">
{formatDate(props.data)}
</div>
</div>
);
}
Estrarre componenti puΓ² sembrare unβattivitΓ pesante ma avere una tavolozza di componenti riutilizzabili ripaga molto bene nelle applicazioni piΓΉ complesse. Una buona regola da tenere a mente Γ¨ che se una parte della tua UI viene usata diverse volte (Bottone
, Pannello
, Avatar
) o se Γ¨ abbastanza complessa di per sΓ© (App
, StoriaFeed
, Commento
), allora questi componenti sono buoni candidati per essere estratti come componenti separati.
Le Props Sono in Sola Lettura
Ogni volta che dichiari un componente come funzione o classe, non deve mai modificare le proprie props. Considera la funzione somma
:
function somma(a, b) {
return a + b;
}
Funzioni di questo tipo vengono chiamate βpureβ perchΓ© non provano a cambiare i propri dati in input, ritornano sempre lo stesso risultato a partire dagli stessi dati in ingresso.
Al contrario, la funzione seguente Γ¨ impura in quanto altera gli input:
function preleva(conto, ammontare) {
conto.totale -= ammontare;
}
React Γ¨ abbastanza flessibile ma ha una sola regola molto importante:
Tutti i componenti React devono comportarsi come funzioni pure rispetto alle proprie props.
Ovviamente, le UI delle applicazioni sono dinamiche e cambiano nel tempo. Nella prossima sezione, introdurremo il nuovo concetto di βstatoβ. Lo stato permette ai componenti React di modificare il loro output nel tempo in seguito ad azioni dellβutente, risposte dalla rete (API) e qualsiasi altra cosa possa far renderizzare un output diverso di volta in volta, ciΓ² avviene senza violare questa regola molto importante.