Большая проблема заключается в том, что вам нужно будет управлять состоянием, которое совместно используется компонентами на более высоком уровне, то есть любым компонентом, который в конечном итоге обернет эти два других компонента. В обычном React это состояние будет управляться родительским (или родительским) компонентом, передавая соответствующие значения как реквизиты. Это противоречит, как правило, плохой идее о том, чтобы братья и сестры влияли на состояние друг друга, поскольку вы хорошо разбираетесь в проблеме «кто здесь хозяин».
То, что обрабатывает Context API, - нет необходимости передавать реквизиты для вещей, которые обычно не меняются (или: как правило, не должны вызывать частые срабатывания визуализации).
Глобальное хранилище состояний, такое как Redux, может помочь вам смоделировать это, но по сути это не намного больше, чем состояние управления компонентом «a» и рендеринг других компонентов в соответствии с этим состоянием. События в нижних компонентах инициируют изменения в данных, что приведет к изменению состояния, что приведет к изменению реквизитов дочерних элементов, что затем приведет к повторным визуализациям.
Я бы посоветовал вам попробовать использовать этот простой шаблон:
class Search ... {
state = {data: [], text: ""}
render() {
return (
<div>
<SearchFilter
data={this.state.data}
onSearch={() => this.fetchNewData()}
onChange={(e) => this.setState({text: e.targetElement.value})}
text={this.state.text}
/>
<SearchResults data={this.state.data} />
</div>
);
}
fetchNewData() {
fetch('/url?text=' + this.state.text)
.then((newData) => { this.setState({data: newData}); })
}
}
Что-то в этом роде. Если у вас есть проблемы с моделированием подобных вещей, вы можете использовать Redux, чтобы заставить вас делать это аналогичным образом, и избегать управления смешиванием локальных состояний с глобальным состоянием (которым обычно трудно управлять).
Если вы сделаете это правильно, компоненты, которые не имеют состояния (то есть не несут ответственности за управление состоянием и, следовательно, не имеют обработчиков событий), могут стать чистыми компонентами, то есть компонентами без состояния, то есть функциями, которые возвращают JSX на основе реквизитов:
const SearchResults = ({data}) => <div>{data.map( () => <etc /> )}</div>