Помните, что поток данных в React однонаправленный . Если вы хотите поделиться данными вокруг своего приложения, компонент поиска не должен быть компонентом, который извлекает данные. Это должно быть оставлено на родительский компонент (может быть, приложение). Этот компонент должен иметь функцию, которая обрабатывает запрос на выборку, и затем вы можете передать ссылку на эту функцию в поисковый компонент для вызова при нажатии кнопки. Затем, после загрузки этих данных, родительский компонент (приложение) может передать все соответствующие данные дочерним компонентам.
Вот быстрый макет, основанный на вашем существующем коде:
class Search extends {
constructor(props) {
super(props);
this.state = { url: '' };
this.handleKey = this.handleKey.bind(this);
}
handleKey(e) {
const url = e.target.value;
this.setState({ url });
}
render() {
const { url } = this.state;
// grab the function passed down from App
const { fetchData } = this.props;
return (
<input onKeyUp={this.handleKey} value={url} />
// Call that function with the url when the button is clicked
<button onClick={() => fetchData(url)}>Click</button>
)
}
}
class App extends Component {
constructor(props) {
super(props);
this.state = { data: [] };
this.fetchData = this.fetchData.bind(this);
}
// App contains the fetch method
fetchData(url) {
fetch(url)
.then(res => res.json())
// Update the App state with the new data
.then(data => this.setState({ data });
}
render() {
const { data } = this.state;
// Sanity check - if the state is still empty of data, present
// a loading icon or something
if (!data.length) return <Spinner />
// otherwise return the rest of the app components
// passing in the fetch method as a prop for the search component
return (
<OtherComponent data={data} />
<Search fetchData={this.fetchData} />
)
}
}