Prop Drilling in React: svantaggi e alternative

Prop Drilling in React: svantaggi e alternative
I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione. Per saperne di più.

La gestione dei dati e la creazione di applicazioni robuste e gestibili sono competenze fondamentali per lo sviluppo di software. Un modo comune per modularizzare le tue app React è utilizzare il prop drilling, che aiuta a trasmettere i dati lungo l'albero dei componenti.





MUO video della giornata SCORRI PER CONTINUARE CON I CONTENUTI

Ma, man mano che i progetti diventano più grandi, la perforazione dell'elica può avere i suoi svantaggi. Esplora i problemi relativi alla perforazione dell'elica e scopri quali alternative sono disponibili.





Comprensione della perforazione dell'elica

Il prop drilling è una tecnica che passa i dati lungo l'albero dei componenti come oggetti di scena, indipendentemente dal fatto che i componenti intermedi necessitino o meno dei dati.





Il drill comporta il passaggio di oggetti di scena da un genitore ai suoi componenti figli e più in basso nella gerarchia. L'obiettivo principale è consentire ai componenti ai livelli inferiori dell'albero di accedere e utilizzare i dati forniti dai componenti di livello superiore.

  Una rappresentazione schematica di come funziona la perforazione dell'elica

Gli svantaggi della perforazione dell'elica

Sebbene il prop drilling risolva il problema della condivisione dei dati, introduce diversi inconvenienti che possono ostacolare la manutenibilità del codice e l'efficienza dello sviluppo.



1. Maggiore complessità

Man mano che un'applicazione cresce, la perforazione dell'elica diventa più difficile da gestire. Ciò può portare a una complessa rete di dipendenze dei componenti, rendendo il codice difficile da comprendere e modificare.

 import ChildComponent from './ChildComponent'; 

export default function ParentComponent = () => {
  const data = 'Prop drilling!';
  return ( <div> <ChildComponent data={data} /> </div> );
};

import GrandChildComponent from './GrandChildComponent';

export default function ChildComponent = ({ data }) => {
  return ( <div> <GrandChildComponent data={data} /> </div> );
};

import GreatGrandChildComponent from './GreatGrandChildComponent';

export default function GrandChildComponent = ({ data }) => {
  return ( <div> <GreatGrandChildComponent data={data} /> </div> );
};

export default function GreatGrandChildComponent = ({ data }) => {
  return ( <div> <p>{data}</p> </div> );
};

In questo caso, i dati dal ParentComponent di primo livello vengono spostati nel GreatGrandChildComponent attraverso due componenti intermedi.





Man mano che la gerarchia dei componenti diventa più profonda e più componenti si affidano all'elica, diventa più difficile tracciare e gestire il flusso di dati.

2. Accoppiamento stretto

Ciò si verifica quando i componenti dipendono l'uno dall'altro tramite oggetti di scena, rendendo difficile modificarli o riutilizzarli. Ciò può rendere difficile apportare modifiche a un componente senza influire sugli altri.





 import ChildComponentA from './ChildComponentA';  
import ChildComponentB from './ChildComponentB';

export default function ParentComponent = () => {
  const sharedData = 'Shared data';

 return (
    <div>
     <ChildComponentA data={sharedData} />
     <ChildComponentB data={sharedData} />
    </div>
 );
};

import GrandChildComponent from './GrandChildComponent';

export default function ChildComponentA = ({ data }) => {
  return (
   <div>
     <p>Component A</p>
     <GrandChildComponent data={data} />
    </div>
 );
};

import GrandChildComponent from './GrandChildComponent';

export default function ChildComponentB = ({ data }) => {
  return (
   <div>
     <p>Component B</p>
     <GrandChildComponent data={data} />
    </div>
 );
};

export default function GrandChildComponent = ({ data }) => {
  return (
    <div> <p>{data}</p> </div>
 );
};

In questo caso, entrambi i componenti figlio ricevono gli stessi dati dal componente padre e li trasmettono a GrandChildComponent.

Se i dati vengono aggiornati, anche tutti i componenti della gerarchia devono essere aggiornati, anche se alcuni non utilizzano i dati. Questo può essere difficile e richiedere molto tempo e aumenta anche il rischio di introdurre bug.

3. Manutenibilità del codice

Il drill dell'elica è un problema di manutenzione del codice perché i nuovi componenti devono accedere agli oggetti di scena passati attraverso la gerarchia. Questo può portare a bug se è necessario modificare molti componenti e incoerenze se cambiano gli oggetti di scena.

 import ChildComponent from './ChildComponent';  

export default function ParentComponent = () => {
  const [count, setCount] = useState(0);

  const incrementCount = () => {
    setCount(count + 1);
  };

  return (
    <div>
     <ChildComponent count={count} incrementCount={incrementCount} />
    </div>
 );
};

import GrandChildComponent from './GrandChildComponent';

export default function ChildComponent = ({ count, incrementCount }) => {
  return (
    <div>
      <button onClick={incrementCount}>Increment</button>
      <GrandChildComponent count={count} />
    </div>
 );
};

export default function GrandChildComponent = ({ count }) => {
  return (
    <div>
      <p>Count: {count}</p>
   </div>
 );
};

Qui il ParentComponent passa il valore del conteggio come prop al ChildComponent e quindi al GrandChildComponent.

Tuttavia, se il conteggio cambia o se c'è una nuova regola per passare oggetti di scena extra, dovrai aggiornare ogni componente nella gerarchia che utilizza l'oggetto di scena. Questo processo è soggetto a errori, rendendo difficile la manutenzione del codice e aumentando le incoerenze o gli errori.

Esplorare le alternative alla perforazione dell'elica

Esistono molte soluzioni di gestione dello stato nell'ecosistema React che puoi utilizzare per superare gli svantaggi della perforazione dell'elica.

Contesto di reazione

React Context è una funzionalità che consente la condivisione dello stato tra i componenti senza passare oggetti di scena. Fornisce un negozio centralizzato a cui i componenti possono accedere con l'hook useContext . Ciò può migliorare le prestazioni e semplificare la gestione dello stato.

  Un diagramma di flusso che mostra React Context che fornisce dati a tutti i componenti in un'applicazione

Redux

Redux è una libreria di gestione dello stato che fornisce un singolo archivio di stato globale. I componenti possono accedere e aggiornare lo stato tramite azioni e riduttori. Questo può aiutare a mantenere il codice organizzato e semplificare il debug.

  Un diagramma di flusso che mostra Redux che fornisce dati a tutti i componenti in un'applicazione

MobX

MobX è una libreria di gestione dello stato che utilizza dati osservabili. Ciò significa che i componenti possono sottoscrivere i cambiamenti nello stato e agire in risposta. La libreria può rendere il tuo codice più reattivo e può migliorare le prestazioni.

  Un diagramma di flusso che mostra diversi concetti e azioni MobX e come si collegano tra loro

Qualcosa

Jotai è una libreria di gestione dello stato per React , che utilizza un modello di stato atomico. Ti consente di creare atomi di stato a cui i componenti possono accedere e aggiornare.

Con Jotai, puoi ridurre la necessità di perforazione dell'elica e ottenere un approccio di gestione dello stato più snello ed efficiente. Il suo design minimalista e l'attenzione alle prestazioni lo rendono una scelta convincente per la gestione dello stato nelle applicazioni React.

  Un diagramma di flusso che mostra diversi concetti e azioni Jotai e come si collegano tra loro

Padroneggiare la comunicazione dei componenti: espandere la tua cassetta degli attrezzi oltre la perforazione dell'elica

Il prop drilling è una tecnica per passare i dati dai componenti padre ai componenti figlio. È efficace per la condivisione dei dati, ma presenta diversi inconvenienti che possono rendere difficile la manutenzione e lo sviluppo del codice.

Per superare questi inconvenienti, puoi utilizzare alternative come React Context, Redux e MobX. Queste soluzioni forniscono un modo più centralizzato per gestire i dati, che può rendere il codice più gestibile e scalabile.

come guadagnarsi da vivere giocando ai videogiochi