React Hooks-在地图中设置状态时无限循环

问题描述

供参考:我正在研究一种滑动益智游戏。

所以我有一个const Board函数,并且定义了两个状态,分别为:

  • puzzlePieces
  • hiddenIndexNumber

“ hiddenIndexNumber”的意义是跟踪游戏中的隐藏块索引。因此,在游戏开始之前,我将遍历为puzzlePieces创建的新数组,并使用map返回HTML元素。循环时,我要确保为我的hiddenIndexNumber获取隐藏块索引,以跟踪隐藏块。

这是我的代码(部分)的外观:

const Board = () => {

    const totalPieces = 9
    const hiddenNumber = totalPieces
    const[hiddenIndexNumber,setHiddenIndex] = useState(-1)
    
    // here I create an array of 9 elements and shuffle them with underline
    const [puzzlePieces,changePuzzlePieceContent] = useState( 
        _.shuffle( [ ...Array( totalPieces ).keys() ].map( num => num + 1 ) ) 
    )

    let puzzleElements = [ ...Array( totalPieces ).keys() ].map( index => {
        // the problem here is that setHiddenIndex makes the framework rerender
        // the DOM after setting the index number and I don't know how to solve the issue here
        if( puzzlePieces[index] === hiddenNumber ) {
            setHiddenIndex(index)
        }

        return <Puzzle 
            key         = { index }
            index       = { index }
            number      = { puzzlePieces[index] }
            hidden      = { puzzlePieces[index] === hiddenNumber && true }
            onChange    = { handleChange }
        />
    } )
}

问题出在此代码上:

if( puzzlePieces[index] === hiddenNumber ) {
    setHiddenIndex(index)
}

如何确保在不要求重新渲染DOM的情况下设置hiddenIndexNumber?

解决方法

我建议您研究一下shouldComponentUpdate()useEffect()挂钩。 此处对此进行了很好的描述:shouldComponentUpdate()?并带有示例。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...