State e Lifecycle
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:
Questa pagina introduce il concetto di state (stato) e lifecycle (ciclo di vita) in un componente React. Puoi trovare un riferimento dettagliato alle API dei componenti qui.
Considera l’esempio dell’orologio di una delle sezioni precedenti. In Renderizzare Elementi, abbiamo appreso solamente un modo per aggiornare la UI. Chiamiamo root.render() per cambiare l’output renderizzato:
const root = ReactDOM.createRoot(document.getElementById('root'));
function tick() {
const element = (
<div>
<h1>Ciao, mondo!</h1>
<h2>Sono le {new Date().toLocaleTimeString()}.</h2>
</div>
);
root.render(element);}
setInterval(tick, 1000);In questa sezione, apprenderemo come rendere il componente Clock davvero riutilizzabile ed incapsulato. Esso si occuperà di impostare il proprio timer e di aggiornarsi ogni secondo.
Possiamo iniziare incapsulando l’aspetto dell’orologio:
const root = ReactDOM.createRoot(document.getElementById('root'));
function Clock(props) {
return (
<div> <h1>Ciao, mondo!</h1> <h2>Sono le {props.date.toLocaleTimeString()}.</h2> </div> );
}
function tick() {
root.render(<Clock date={new Date()} />);}
setInterval(tick, 1000);Tuttavia, manca un requisito fondamentale: il fatto che Clock imposti un timer ed aggiorni la propria UI ogni secondo dovrebbe essere un dettaglio implementativo di Clock.
Idealmente, vorremmo scrivere il seguente codice una volta sola, ed ottenere che Clock si aggiorni da solo:
root.render(<Clock />);Per implementare ciò, abbiamo bisogno di aggiungere uno “stato” al componente Clock.
Lo state (o stato) è simile alle props, ma è privato e completamente controllato dal componente.
Convertire una Funzione in una Classe
Puoi convertire un componente funzione come Clock in una classe in cinque passaggi:
- Crea una classe ES6, con lo stesso nome, che estende
React.Component. - Aggiungi un singolo metodo vuoto chiamato
render(). - Sposta il corpo della funzione all’interno del metodo
render(). - Sostituisci
propsconthis.propsnel corpo del metodorender(). - Rimuovi la dichiarazione della funzione rimasta vuota.
class Clock extends React.Component {
render() {
return (
<div>
<h1>Ciao, mondo!</h1>
<h2>Sono le {this.props.date.toLocaleTimeString()}.</h2>
</div>
);
}
}Clock è ora definito da una classe, invece che da una funzione.
Il metodo render viene invocato ogni volta che si verifica un aggiornamento, ma finché renderizziamo <Clock /> nello stesso nodo del DOM, verrà utilizzata un’unica istanza della classe Clock. Questo ci consente di utilizzare funzionalità aggiuntive come il local state e i metodi del lifecycle del componente.
Aggiungere il Local State ad una Classe
Sposteremo date dalle props allo state in tre passaggi:
- Sostituisci
this.props.dateconthis.state.datenel metodorender():
class Clock extends React.Component {
render() {
return (
<div>
<h1>Ciao, mondo!</h1>
<h2>Sono le {this.state.date.toLocaleTimeString()}.</h2> </div>
);
}
}- Aggiungi un costruttore di classe che assegna il valore iniziale di
this.state:
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()}; }
render() {
return (
<div>
<h1>Ciao, mondo!</h1>
<h2>Sono le {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}Nota come passiamo props al costruttore di base:
constructor(props) {
super(props); this.state = {date: new Date()};
}I componenti classe dovrebbero sempre chiamare il costruttore base passando props come argomento.
- Rimuovi la prop
datedall’elemento