Componenti a classi

GCGiuseppe Crescitelli

I componenti a classi sono una delle due principali tipologie di componenti React. Si basano sulle classi JavaScript ES6 e permettono di gestire stato interno e ciclo di vita tramite metodi dedicati. Oggi sono meno utilizzati nei nuovi progetti, ma restano fondamentali per comprendere React e per lavorare su codebase legacy.

Un componente a classi deve estendere React.Component e implementare obbligatoriamente il metodo render, che restituisce il JSX da visualizzare.

Esempio base di componente a classi

import React from "react";

class Welcome extends React.Component {
  render() {
    return <h1>Ciao {this.props.name}</h1>;
  }
}

export default Welcome;

Costruttore e this.state

Il costruttore è un metodo speciale utilizzato per inizializzare lo stato del componente e fare il binding dei metodi. Viene eseguito una sola volta, al momento della creazione dell’istanza del componente.

All’interno del costruttore è necessario chiamare super(props) per inizializzare correttamente React.Component e avere accesso a this.props.

Lo stato interno di un componente a classi viene definito tramite this.state, che deve essere un oggetto.

Inizializzazione dello stato

class Counter extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      count: 0,
    };
  }

  render() {
    return <p>Valore: {this.state.count}</p>;
  }
}

Lo stato non deve mai essere modificato direttamente. Per aggiornare lo stato si utilizza this.setState, che forza il re-render del componente.

Aggiornamento dello stato

this.setState({
  count: this.state.count + 1,
});

Quando il nuovo stato dipende dal valore precedente, è consigliato usare la forma con funzione.

this.setState((prevState) => ({
  count: prevState.count + 1,
}));

Metodi di ciclo di vita

I metodi di ciclo di vita permettono di eseguire codice in momenti specifici della vita di un componente: montaggio, aggiornamento e smontaggio. Sono disponibili esclusivamente nei componenti a classi.

Fase di montaggio

I metodi di questa fase vengono eseguiti quando il componente viene inserito nel DOM.

constructor

Utilizzato per inizializzare stato e binding. Non è consigliato eseguire side effects.

componentDidMount

Viene chiamato subito dopo il primo render. È il metodo corretto per effettuare chiamate API, sottoscrizioni o operazioni sul DOM.

componentDidMount() {
  fetch("/api/data")
    .then(res => res.json())
    .then(data => {
      this.setState({ data });
    });
}

Fase di aggiornamento

Questi metodi vengono eseguiti quando cambiano props o stato.

componentDidUpdate

Viene chiamato dopo ogni aggiornamento. Permette di reagire ai cambiamenti confrontando valori precedenti e attuali.

componentDidUpdate(prevProps, prevState) {
  if (prevState.count !== this.state.count) {
    console.log("Il contatore è cambiato");
  }
}

Fase di smontaggio

componentWillUnmount

Viene chiamato immediatamente prima che il componente venga rimosso dal DOM. È usato per cleanup come rimuovere event listener, timer o sottoscrizioni.

componentWillUnmount() {
  clearInterval(this.timer);
}

Considerazioni finali

I componenti a classi forniscono un controllo esplicito sul ciclo di vita ma risultano più verbosi rispetto ai componenti funzionali con Hooks. Nelle applicazioni moderne si preferiscono i componenti funzionali, ma la conoscenza dei componenti a classi è essenziale per comprendere React e mantenere progetti legacy.