Confronto concettuale tra architettura React e modello MVC tradizionale

Perché React non è MVC (e smettere di trattarlo come tale)

Trattare React come MVC è uno degli errori più comuni e dannosi. In questo articolo capisci perché React segue un modello diverso e come evitare architetture fragili.

Uno degli errori più comuni (e più costosi) quando si lavora con React è cercare di incastrarlo dentro il modello MVC.

Succede quasi sempre a chi:

  • viene da backend tradizionale
  • ha studiato architetture “classiche”
  • cerca ordine replicando schemi già conosciuti

Il risultato è prevedibile:

  • componenti che fanno troppe cose
  • stato sparso
  • logica difficile da seguire
  • refactor dolorosi

👉 Il problema non è React.
👉 Il problema è forzare un modello che React non è.


Confronto concettuale tra architettura React e modello MVC tradizionale

Perché MVC è così difficile da abbandonare

MVC (Model–View–Controller) ha funzionato bene per anni perché risolveva un problema preciso:

separare responsabilità in sistemi server-centrici

Ma React nasce per un contesto diverso:

  • UI dinamiche
  • stato che cambia spesso
  • rendering reattivo
  • flussi asincroni continui

Applicare MVC a React è come usare una mappa di carta per guidare un drone:
ti dà l’illusione di controllo, ma non descrive il sistema che stai usando.


React non ha Controller (e questo manda in crisi)

Nel modello MVC:

  • il Model gestisce i dati
  • il View mostra
  • il Controller coordina

In React:

  • non esiste un controller centrale
  • non c’è un punto unico che “decide cosa fare”
  • la UI è una funzione dello stato

Questo è il cuore del modello dichiarativo di React, spiegato chiaramente anche nella documentazione ufficiale quando si introduce il concetto di pensare in React.

Tu non dici:

“quando succede X, fai Y”

Dici:

“se lo stato è X, la UI è Y”

È una differenza sottile, ma devastante se la ignori.


Il danno più comune: componenti-controller mascherati

Quando tratti React come MVC, succede questo:

  • nascono componenti enormi
  • pieni di logica decisionale
  • che orchestrano tutto

Sono controller travestiti da componenti.

Segnali tipici:

  • if annidati ovunque
  • stato che governa mezzo albero
  • side effect gestiti “per far funzionare le cose”
  • difficoltà a testare

Questi componenti diventano colli di bottiglia.
Ogni modifica è rischiosa. Ogni bug è difficile da isolare.


In React il flusso è unidirezionale (e questo cambia tutto)

Un altro punto di rottura con MVC è il flusso dei dati.

In React:

  • i dati scendono
  • le azioni risalgono
  • lo stato guida il rendering

Questo flusso unidirezionale è uno dei principi fondamentali del framework ed è alla base della sua prevedibilità, come spiegato anche nella panoramica MDN su React e sulla gestione dello stato.

MVC invece:

  • prevede più direzioni
  • più punti di coordinamento
  • più accoppiamento implicito

Se cerchi di replicare questo schema in React, stai combattendo il framework.


React non è MVC. È composizione + stato + dichiaratività

Un modello mentale più corretto per React è questo:

  • Componenti → funzioni di rendering
  • Stato → fonte di verità
  • Composizione → modo di costruire UI complesse
  • Eventi → segnali che richiedono cambiamento

Non c’è un controller che coordina tutto.
C’è uno stato che determina cosa esiste.

Quando accetti questo:

  • i componenti diventano più piccoli
  • la logica si distribuisce
  • il codice è più leggibile

Perché “separare tutto” spesso peggiora le cose

Chi ragiona in MVC tende a forzare:

  • cartelle controllers
  • cartelle models
  • cartelle views

In React questo spesso produce:

  • frammentazione artificiale
  • passaggi inutili
  • più boilerplate

React non chiede di separare per tipo.
Chiede di separare per responsabilità.

Un componente può:

  • gestire stato
  • renderizzare UI
  • reagire a eventi

Non è un problema.
È una scelta intenzionale del framework.


Il vero criterio: cosa cambia nel tempo

Se vuoi un principio pratico che funziona meglio di MVC, usa questo:

Se qualcosa cambia nel tempo, è stato.
Se qualcosa reagisce al cambiamento, è rendering.
Se qualcosa descrive come combinare parti, è composizione.

Questo ti evita:

  • controller centrali
  • logica duplicata
  • dipendenze nascoste

Ed è perfettamente allineato con il modo in cui React è stato progettato.


Conclusione: smettere di cercare MVC è un atto di maturità

React non è MVC.
Non lo diventerà.
E non è un limite.

È un framework pensato per:

  • interfacce dinamiche
  • flussi complessi
  • cambiamento continuo

Continuare a trattarlo come MVC significa:

  • rallentare
  • complicare
  • perdere i benefici reali

Quando smetti di cercare controller e inizi a modellare lo stato e le responsabilità, React diventa finalmente leggibile.

Non perché è semplice.
Ma perché stai usando il modello giusto.

Vuoi completare davvero il quadro?

A questo punto il passo naturale è capire come organizzare un progetto React senza cadere in cartelle MVC travestite.

👉 Architettura React: come strutturare un progetto senza framework mentali sbagliati