Se esse mesmo cenário não estiver espalhado em todos os lugares, você poderá usar o contexto do React, especialmente se não desejar introduzir toda a sobrecarga que as bibliotecas de gerenciamento de estado apresentam. Além disso, é mais fácil aprender. Mas tenha cuidado, você pode usá-lo demais e começar a escrever códigos incorretos. Basicamente, você define um componente Container (que manterá e manterá esse estado para você), tornando todos os componentes interessados em escrever / ler esses dados em seus filhos (não necessariamente filhos diretos)
https://reactjs.org/docs/context.html
Você também pode usar o React comum corretamente.
<Component5 onSomethingHappenedIn5={this.props.doSomethingAbout5} />
passar doSomethingAbout5 até o Componente 1
<Component1>
<Component2 onSomethingHappenedIn5={somethingAbout5 => this.setState({somethingAbout5})}/>
<Component5 propThatDependsOn5={this.state.somethingAbout5}/>
<Component1/>
Se esse é um problema comum, você deve começar a pensar em mudar todo o estado do aplicativo para outro lugar. Você tem algumas opções, as mais comuns são:
https://redux.js.org/
https://facebook.github.io/flux/
Basicamente, em vez de gerenciar o estado do aplicativo em seu componente, você envia comandos quando algo acontece para atualizar o estado. Os componentes extraem o estado desse contêiner também para que todos os dados sejam centralizados. Isso não significa que não é mais possível usar o estado local, mas esse é um tópico mais avançado.