You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件状态修改问题:Pokemon API类型切换不生效

问题分析与解决

你的核心问题出在useEffect的依赖配置上:

  • 你当前的useEffect依赖数组是[],这表示它只会在组件首次挂载时执行一次。
  • 虽然handleSelect能正确更新value状态,但因为useEffect没有监听value的变化,所以不会重新触发数据请求,导致新的value无法传递给getPokemonTypes函数。

修复步骤

  1. 更新useEffect的依赖数组
    把value添加到useEffect的依赖数组中,这样每当value变化时,useEffect就会重新执行,调用fetchData获取对应类型的宝可梦数据:
useEffect(() => {
    async function fetchData() {
        const pokemonTypesCard = await getPokemonTypes(value)
        const pokemonIdText = pokemonTypesCard.pokemon.map((item) => {
            return item.pokemon.name
        })
        const data = pokemonIdText.map(async (pokemonId) => {
            return await getPokemonInfo(pokemonId)
        })
        const pokemonIdNumber = await Promise.all(data)
        setPokemonIdNumber(pokemonIdNumber)
        setPokemonTypesCard(pokemonTypesCard)
    }
    fetchData()
}, [value]) // 此处添加value作为依赖
  1. 优化空数据判断逻辑
    你的初始pokemonIdNumber是[](空数组),!pokemonIdNumber永远为false(空数组属于真值),可以修改为判断数组长度:
{pokemonIdNumber.length === 0 ? '' : pokemonIdNumber.map((item, index) =>
    <li key={index}>
        <Link to={`/pokemon/${item.id}`}>
            <img
                src={`https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${item.id}.png`}
                alt={item.name}
            />
        </Link>
        <p>{item.name}</p>
    </li>
)}

额外建议

  • 可以添加加载状态,在数据请求过程中显示加载提示,提升用户体验。
  • 考虑添加防抖处理,避免快速切换类型时频繁发起请求。

内容的提问来源于stack exchange,提问作者Alex_Lima84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:39:22