【问题标题】:Avoid infinite loop when updating更新时避免死循环
【发布时间】:2022-11-27 08:55:56
【问题描述】:

我必须更新项目状态并立即查看更改。当我在下面这样做时,我得到了一个无限循环。

 useEffect(() => {
    const playersInFight = gameData.characters.filter((x) =>
      fightData.currentPositionInfoDTOS.some((y) => y.entityId == x.id)
    );

    let orderedCharacters = addPlayers(
      playersInFight,
      fightData.currentPositionInfoDTOS,
      fightData.turnOrder
    );
    setAllCharacterCards(orderedCharacters);

  }, [fightData, gameData, fightInfo, allCharacterCards, allCharacters]);

我也试过这样:

  useEffect(() => {
    const playersInFight = gameData.characters.filter((x) =>
      fightData.currentPositionInfoDTOS.some((y) => y.entityId == x.id)
    );

    let orderedCharacters = addPlayers(
      playersInFight,
      fightData.currentPositionInfoDTOS,
      fightData.turnOrder
    );
    setAllCharacterCards(orderedCharacters);

  }, [fightData, gameData, fightInfo, allCharacterCards, allCharacters]);

  useEffect(() => {
    setAllCharacterCards(allCharacterCards);
  }, [allCharacterCards]);

多亏了我没有无限循环,但要看到我必须刷新页面的变化...... 我该如何解决这个问题?

更新: 这是我的回报:

return (
    <section>
        <div className="player-fight">
          {allCharacterCards ? (
            <div>
              {allCharacterCards.map((c, idx) => {
                return (
                  <li key={idx} className="player-fight-bottom__player-card">
                    <CardComponentPlayerCard
                      id={c.id}
                      name={c.name}
                      money={c.money}
                      health={c.health}
                      maxHealth={c.maxHealth}
                      mine={false}
                      description={c.description}
                      statuses={c.statuses}
                      image={c.photoPath}
                    />
                  </li>
                );
              })}
            </div>
          ) : (
            <LoadingSpinner />
          )}
        </div>
    </section>
  );

【问题讨论】:

  • 所有这些依赖项是否都会触发更改 [fightData、gameData、fightInfo、allCharacterCards、allCharacters],我的意思是更新 allCharacters 的条件是什么,看起来你可能需要一个 useMemo

标签: javascript reactjs typescript


【解决方案1】:

为避免无限循环,您需要从 useEffect 依赖项数组中删除 allCharacterCards

 useEffect(() => {
    const playersInFight = gameData.characters.filter((x) =>
      fightData.currentPositionInfoDTOS.some((y) => y.entityId == x.id)
    );

    let orderedCharacters = addPlayers(
      playersInFight,
      fightData.currentPositionInfoDTOS,
      fightData.turnOrder
    );

    setAllCharacterCards([...orderedCharacters]);

  }, [fightData, gameData, fightInfo, allCharacters]);

解释(问题编辑后)

    setAllCharacterCards([...orderedCharacters]);

这应该可以解决您的问题。

【讨论】:

猜你喜欢
  • 2017-10-18
  • 2020-10-25
  • 1970-01-01
  • 2011-09-19
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多