React.js点击重置状态异常:基于umd-sudoku的数独应用问题
解决数独应用新游戏时正确性标记残留的问题
嘿,我来帮你搞定这个头疼的问题~ 你遇到的核心问题其实是状态不同步:启动新游戏时,你只更新了棋盘数据,但存储单元格正确性的布尔状态没跟着新棋盘一起重置,导致旧的标记还挂在原来的索引位置上。下面给你具体的解决思路和代码示例:
1. 同步重置所有相关状态
每次触发新游戏时,除了更新initialBoard和用户输入的board,必须同时重置正确性标记的状态。假设你用cellCorrectness数组来存储每个单元格的正确状态,那新游戏函数应该这样写:
// 假设你的状态定义是这样的 const [initialBoard, setInitialBoard] = useState([]); const [board, setBoard] = useState([]); const [cellCorrectness, setCellCorrectness] = useState([]); // 新游戏核心函数 const startNewGame = () => { // 调用umd-sudoku生成全新的初始棋盘 const newInitialBoard = generateSudoku(); // 替换成umd-sudoku实际的生成方法 // 初始化用户棋盘(比如复制初始棋盘,可编辑位设空,具体看umd-sudoku的规则) const newBoard = [...newInitialBoard]; // 初始化正确性状态:固定数字(不可编辑的)默认标记为正确,可编辑位先设为false const newCellCorrectness = newInitialBoard.map(row => row.map(cell => cell !== 0) // 假设umd-sudoku用0表示可编辑单元格 ); // 同步更新所有状态,确保它们都基于新棋盘 setInitialBoard(newInitialBoard); setBoard(newBoard); setCellCorrectness(newCellCorrectness); };
2. 用衍生状态自动计算正确性(更省心的方案)
如果不想手动管理cellCorrectness的状态,你可以用useMemo把它变成衍生状态——每次board或正确答案变化时,自动重新计算正确性标记,从根源上避免残留问题:
const [initialBoard, setInitialBoard] = useState([]); const [board, setBoard] = useState([]); // 用useMemo缓存正确答案,避免重复计算 const correctAnswer = useMemo(() => { return getSudokuAnswer(initialBoard); // 替换成umd-sudoku获取答案的方法 }, [initialBoard]); // 自动计算每个单元格的正确性 const cellCorrectness = useMemo(() => { return board.map((row, rowIdx) => row.map((cell, colIdx) => cell === correctAnswer[rowIdx][colIdx]) ); }, [board, correctAnswer]); // 新游戏时只需更新棋盘数据,正确性标记会自动同步 const startNewGame = () => { const newInitialBoard = generateSudoku(); const newBoard = [...newInitialBoard]; setInitialBoard(newInitialBoard); setBoard(newBoard); };
3. 检查功能的逻辑修正
如果你的检查功能是手动触发的,也要确保它基于当前的board和最新的正确答案来更新状态,而不是依赖旧的数据:
const checkBoard = () => { const correctAnswer = getSudokuAnswer(initialBoard); const newCorrectness = board.map((row, rowIdx) => row.map((cell, colIdx) => cell === correctAnswer[rowIdx][colIdx]) ); setCellCorrectness(newCorrectness); // 如果是手动管理状态的话 };
关键总结
本质上就是要让所有和棋盘相关的状态保持强绑定:新棋盘生成时,用户输入的棋盘、正确性标记必须一起重置或重新计算,不能只更新其中一部分。用衍生状态的方案会更简洁,因为它能自动跟着依赖项变化,不用手动维护同步逻辑。
内容的提问来源于stack exchange,提问作者llievredemars
相关产品推荐
相关产品推荐

