首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一张卡片中重新呈现列表项而不是一张卡片列表。

在同一张卡片中重新呈现列表项而不是一张卡片列表。
EN

Stack Overflow用户
提问于 2021-02-12 12:11:17
回答 2查看 143关注 0票数 0

我正在做一个简单的pokedex,它应该列出所有第1代pokemon,并从https://pokeapi.co/检索数据

当我到达屏幕时,虽然我可以看到我打印时拥有所有的pokemon,但是列表开始循环并重新复制同一张卡片,而不是更新卡片列表和添加卡片,而不是替换已经存在的卡片。

我认为我的问题是理解反应渲染循环。谁能给我指出正确的方向吗?

下面是我有一个从api获取单个pokemon的方法的页面,这是到我的github https://github.com/vradu007/poke-frontend的链接。

谢谢!

代码语言:javascript
复制
const MainPage = (props) => {
    const [pokemons, setPokemons] = useState([]);
    
    const getPokemon = async (pokemonId) => {
        let pokemon = {};
        try {
            // const apiUrl = `https://pokeapi.co/api/v2/pokemon/${pokemon}`;
            // const res = await axios.get(apiUrl);
            // pokemons.push(res.data);
            pokemon = fetch(`https://pokeapi.co/api/v2/pokemon/${pokemonId}`)
                .then((response) => response.json())
                .then((response) => setPokemons([...pokemons, response]))
                .then(() => {console.log(pokemons)});
        } catch (error) {
            console.log(error);
        }
    };

    useEffect(() => {
        for( let i = 0; i<151; i++){
            getPokemon(i);
        }
    },[]);

    return (
        <React.Fragment>
            <Header title="Pokemon Page" />
            <PokemonList pokemons={pokemons} />
        </React.Fragment>
    );
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-12 12:30:40

这是因为您的setState是异步的,状态更新依赖于以前的状态,因此需要对setPokemons函数进行回调。这个解决方案不是很好,因为您更新状态的次数太多了。另一个用户已经发布了更好的方法,即当您的所有承诺都得到解决时,只发布setState。

代码语言:javascript
复制
 pokemon = fetch(`https://pokeapi.co/api/v2/pokemon/${pokemonId}`)
                .then((response) => response.json())
                .then((response) => setPokemons(pokemons => [...pokemons, response]))
                .then(() => {console.log(pokemons)});
票数 2
EN

Stack Overflow用户

发布于 2021-02-12 12:21:22

编辑--它可以用React (vanshaj发布的方式)来完成,但下面是另一种执行方式:-

代码语言:javascript
复制
const MainPage = (props) => {
    const [pokemons, setPokemons] = useState([]);
    
    const getPokemon = async (pokemonId) => {
        try {
            const apiUrl = `https://pokeapi.co/api/v2/pokemon/${pokemonId}`;
            const res = await axios.get(apiUrl).then(res=>res.json());
            return res;
        } catch (error) {
            console.log(error);
        }
    };

    useEffect(() => {
      async function gottaCatchEmAll(){
        const promises = [];
        for( let i = 0; i<151; i++){
            promises.push(getPokemon(i));
        }
       const pokemons = await Promise.all(promises);
       setPokemons(pokemons);
      }
    gottaCatchEmAll();
    },[]);

    return (
        <React.Fragment>
            <Header title="Pokemon Page" />
            <PokemonList pokemons={pokemons} />
        </React.Fragment>
    );
};

在您的实现中,您试图独立地在所有承诺中设置状态。您需要确保的是,所有这些承诺都像前面那样以异步方式得到解决,但它们被分组在一起,以便当所有这些承诺得到解决时,可以返回一个集体输出,该输出可以在一次传递中设置为状态。这种分组机制是Promise.all

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66171653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档