我正在尝试在精灵宝可梦API上实现搜索功能,我已经尝试了不同的方法,但由于某些原因,我无法使其工作。
我的想法是创建一个函数来处理事件上的更改,然后将其传递给一个钩子(UseState),然后可能发出get请求并重新呈现?
我有这个方法来从API中获取所有的Pokemons。我是否应该创建一个新的设计来过滤请求?
export async function getAllPokemon(url) {
return new Promise((resolve) => {
fetch(url).then(res => res.json())
.then(data => {
resolve(data)
})
});
}function App() {
....
const [filter, setFilter] = useState("");
function handleChange(event) {
setOption(event.target.value)
console.log(option)
}
const initialURL = `https://pokeapi.co/api/v2/pokemon?limit=50`
const handleSearchChange = (e) => {
setFilter(e.target.value);
};
useEffect(() => {
async function fetchData() {
let response = await getAllPokemon(initialURL)
await loadPokemon(response.results);
setLoading(false);
}
fetchData();
}, [option])
const loadPokemon = async (data) => {
let _pokemonData = await Promise.all(data.map(async pokemon => {
let pokemonRecord = await getPokemon(pokemon)
return pokemonRecord
}))
setPokemonData(_pokemonData);
}
return (
<>
<div >
<div>
<input
type="text"
id="header-search"
placeholder="Search Pokemon"
name="s"
onChange={handleSearchChange}
/>
<button >Search</button>
</div>
</div>
<div>
{loading ? <h1 style={{ textAlign: 'center' }}>Loading...</h1> : (
<>
<div className="grid-container">
{pokemonData.map((pokemon) => {
return <Card pokemon={pokemon} />
})}
</div>
</>
)}
</div>
</>
);
}
export default App;发布于 2021-09-25 21:34:53
你需要过滤你在onChange中得到的精灵宝可梦的数组。所以就像这样
onChange = e = > {
setPokemons(pokemons.filter(pokemon => pokemon.indexOf(e.target.value) > -1))
}因此,这将切换您在键入的每个键上呈现的本地状态变量,这反过来将过滤您的数组。
https://stackoverflow.com/questions/69329996
复制相似问题