Я немного сбит с толку относительно избыточного состояния между двумя компонентами.Я думаю, что я бы сделал (если бы я не использовал что-то вроде mobx), сохранив состояние родительского компонента и передав функции handleChange
и handleSearch
компоненту <Search />
.Это выглядело бы примерно так ...
Я собрал для вас коды и коробки: https://codesandbox.io/s/n1ryz4rzwl
Компонент приложения
import React, { Component } from 'react';
import SearchBar from './components/SearchBar'
class App extends Component {
constructor() {
super()
this.state = {
searchQuery: '',
fetchedData: []
}
}
handleChangeQuery = event => this.setState({searchQuery: event.target.value})
handleSearch = () => {
const {searchQuery} = this.state,
API_KEY = `https://pokeapi.co/api/v2/pokemon/${searchQuery}`;
fetch(API_KEY, {
method: 'GET',
headers: {
Accept: 'application/json'
}
})
.then(result => result.json())
.then(data => this.setState({ fetchedData: data.results }));
}
render() {
const {searchQuery} = this.state
return (
<div className="App">
<h2>Search Pokemos by Types</h2>
<hr />
<SearchBar
value={searchQuery}
handleChangeQuery={this.handleChangeQuery}
handleSearch={this.handleSearch}
/>
// Show fetchedData results here
</div>
)
}
}
export default App
Компонент SearchBar - Этот МОЖЕТ быть функциональным компонентом без сохранения состояния
import React from 'react'
const SearchBar = ({value, handleChangeQuery, handleSearch}) => {
return (
<div className="input-group">
<input
onChange={handleChangeQuery}
value={value}
className="form-control"
placeholder="[eg. Ditto, Cheri, etc]"
/>
<button onClick={handleSearch} className="btn btn-success">Search</button>
</div>
)
}
export default SearchBar
Причины странного пропущенного символа были описаны в других комментариях - как this.setState()
можетбыть асинхроннымОднако, this.setState()
имеет функцию обратного вызова, которую можно использовать для подтверждения изменения, если вы хотите проверить это.Это выглядит примерно так:
this.setState({key: value}, () => {
// State has been set
console.log(this.state.key)
})