为什么我的挂钩状态无法正确更新?

时间:2020-10-29 23:37:38

标签: arrays reactjs react-hooks state

我不知道该怎么做,我无法使用api数组更新状态,如果我将其投入使用,则出现错误原因是我没有发送任何数据,请帮助我。时间使用stackoverflow


    import React, { useEffect, useState } from "react";
    import getTeam from "../Helpers/getTeam";
    
    const selectTeams = [
        "Barcelona",
        "Real Madrid",
        "Juventus",
        "Milan",
        "Liverpool",
        "Arsenal",
    ];
    
    const Select = () => {
        const [team, setTeam] = useState(null);
        const [loading, setLoading] = useState(null);
    
        const handleOption = async (e) => {
            setLoading(true);
            let teamsJson = await getTeam(e.target.value);
            let arr = [];
            Object.keys(teamsJson).map((teamjs, i) => {
                return arr.push(teamsJson[teamjs]);
            });
            console.log(arr);
            console.log(team);
            setTeam(arr);
            setLoading(false);
        };
    
        return (
            <div
                style={{ background: "skyblue", textAlign: "center", padding: "20px" }}
            >
                <h1>Equipos Disponibles</h1>
                <div>
                    <select onChange={handleOption}>
                        <option>Elige tu equipo</option>
                        {selectTeams.map((selectTeam, i) => {
                            return <option key={i}>{selectTeam}</option>;
                        })}
                    </select>
                </div>
                {loading ? <h1>suave</h1> : (
                    team !== null ? (
                        team.map((newTeam, i) => {
                            return (
                                <div>
                                    the items are here
                                </div>
                            )
                        })
                    ) : null
                )}
            </div>
        );
    };
    
    export default Select;

我让你的我的api文件下来

const getTeam = async (teamName) => {
    const url = `https://www.thesportsdb.com/api/v1/json/1/searchteams.php?t=${teamName}`;

    const res = await fetch(url);

    const team = await res.json();

    return team;
};

export default getTeam;

我想通过api调用的响应来更新我的const团队,但是它不会更新它,我不知道该怎么做,请帮助我

2 个答案:

答案 0 :(得分:1)

teamsJson值是具有单个键和某个数组值的对象

{ teams: [...] }

因此,当您将值推入另一个数组时,您正在使用嵌套数组更新状态。

let arr = [];
Object.keys(teamsJson).map((teamjs, i) => {
  return arr.push(teamsJson[teamjs]);
});

根据您要映射team状态数组的方式,我假设您只需要teamJson的原始内部数组。

const { teams } = await getTeam(e.target.value);
setTeam(teams);

然后,在进行映射时,您可以访问所需的任何属性。

team.map((newTeam, i) => {
  return <div key={i}>{newTeam.idTeam}</div>;
})

Edit why-my-hook-state-doesn%C2%B4t-update-correctly

enter image description here

答案 1 :(得分:0)

我刚刚对其进行了测试,并且看起来效果很好。

唯一的两个问题似乎是:

  1. 除了在team语句之外,您都不会在任何地方使用console.log
  2. 当您console.log(team);时,常量team将会(但)还是第一次null(因为它仍然保持初始状态)。

这是我在<select>中随机挑选一支球队后在React dev tools中看到的内容:

enter image description here