Se questo stesso scenario non è diffuso ovunque, è possibile utilizzare il contesto di React, specialmente se non si desidera introdurre tutto il sovraccarico introdotto dalle librerie di gestione dello stato. Inoltre, è più facile da imparare. Ma fai attenzione, potresti abusarne e iniziare a scrivere codice errato. Fondamentalmente definisci un componente Container (che manterrà e manterrà quel pezzo di stato per te) rendendo tutti i componenti interessati a scrivere / leggere quel pezzo di dati suoi figli (non necessariamente indirizzare figli)
https://reactjs.org/docs/context.html
In alternativa, puoi anche utilizzare semplicemente React correttamente.
<Component5 onSomethingHappenedIn5={this.props.doSomethingAbout5} />
passare doSomethingAbout5 fino al componente 1
<Component1>
<Component2 onSomethingHappenedIn5={somethingAbout5 => this.setState({somethingAbout5})}/>
<Component5 propThatDependsOn5={this.state.somethingAbout5}/>
<Component1/>
Se questo è un problema comune, dovresti iniziare a pensare di spostare l'intero stato dell'applicazione in un altro posto. Hai alcune opzioni, le più comuni sono:
https://redux.js.org/
https://facebook.github.io/flux/
Fondamentalmente, invece di gestire lo stato dell'applicazione nel tuo componente, invii comandi quando succede qualcosa per ottenere lo stato aggiornato. I componenti estraggono anche lo stato da questo contenitore, quindi tutti i dati sono centralizzati. Questo non significa che non è più possibile utilizzare lo stato locale, ma questo è un argomento più avanzato.