【问题标题】:useState is not updating state variable in async functionuseState 没有更新异步函数中的状态变量
【发布时间】:2022-10-14 23:58:16
【问题描述】:
const getChoices = async () => {
    try {
      setIsLoading(true);
      for (let i = 0; i < 1387; i++) {
        for (let j = 0; j < days.length; j++) {
          if (
            moment(data[i].date.start).utc().format("MM/DD/YYYY") === days[j]
          ) {
            const kli = await Contract.methods
              .GetChoice(data[i].id)
              .call({ from: Account[0] });
            console.log(kli);
            if (kli === "0") {
              // console.log(data[i]);
            } else {
              if (parseInt(kli) === data[i].teams.home.id) {
                console.log("inserted in home");
                console.log(data[i].id, data[i].teams.home.nickname);
                setChoices((oldState) => [
                  ...oldState,
                  {
                    MatchID: data[i].id,
                    BetTeamName: data[i].teams.home.nickname,
                  },
                ]);
              } else if (parseInt(kli) === data[i].teams.visitors.id) {
                console.log("inserted in vistiroes");
                setChoices((oldState) => [
                  ...oldState,
                  {
                    MatchID: data[i].id,
                    BetTeamName: data[i].teams.visitors.nickname,
                  },
                ]);
              }
            }
          }
        }
      }
      console.log(choices[1]);
      setChoices([...new Set(choices)]);
      console.log(choices[0]);
    } finally {
      setIsLoading(false);
    }
  };

这是用于附加每个用户的选择的异步函数。 它在 useEffect 中调用。 useState 没有更新变量的状态。

这是控制台日志

10PublicPools.js:56 0
PublicPools.js:56 25
PublicPools.js:71 inserted in vistiroes
PublicPools.js:56 26
PublicPools.js:61 inserted in home
PublicPools.js:62 11027 'Magic'
PublicPools.js:56 21
PublicPools.js:71 inserted in vistiroes
10PublicPools.js:56 0
PublicPools.js:56 19
PublicPools.js:71 inserted in vistiroes
PublicPools.js:56 25
PublicPools.js:71 inserted in vistiroes
PublicPools.js:56 14
PublicPools.js:71 inserted in vistiroes
PublicPools.js:56 7
PublicPools.js:71 inserted in vistiroes
7PublicPools.js:56 0
PublicPools.js:84 undefined
PublicPools.js:86 undefined

useState 目前在那里工作正常但开始表现得很奇怪我尝试了几个解决方案但仍然面临同样的问题

【问题讨论】:

    标签: node.js reactjs


    【解决方案1】:

    setChoices 导致您的组件一次又一次地重新渲染,因为它在循环内,或者您可以将结果分配到临时变量中,然后在循环结束后仅调用一次 setChoices。

    const {choices, setChoices} = useState([]);
    
    const getChoices = async () => {
        const temp = [];
        for(let i = 0; i < 10; i++){
            temp.push({val: i * 2});
        }
        setChoices([...temp]);
    }
    

    【讨论】:

    • 我希望我的状态是数组而不是单个变量我应该怎么做?
    • 是的,您可以使用临时数组,我已经通过示例编辑了我的回复以使其清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2021-01-27
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多