【发布时间】:2023-03-08 18:22:01
【问题描述】:
我有一个小型井字游戏,一切都很好,除了我正在努力寻找在代码中放置完成功能的位置。让我给你看;
import React, { useState } from "react";
import { isGameOver } from "../Helper/helper";
import Square from "./Square";
const Board: React.FC = () => {
const [squares, setSquares] = useState(new Array(9).fill(""));
const [activePlayer, setActivePlayer] = useState("Player 1");
const [winner, setWinner] = useState<any>();
const clickSquare = (id: number): void => {
if (!squares[id]) {
if (activePlayer === "Player 1") {
setActivePlayer("Player 2");
} else {
setActivePlayer("Player 1");
}
}
setSquares((prevSquares) => {
return prevSquares.map((square, i) => {
if (i === id && !square) {
square = activePlayer === "Player 1" ? "X" : "O";
}
return square;
});
});
};
return (
<div className="board">
<div className="game-field">
{squares.map((square, i) => {
return (
<Square clickSquare={clickSquare} square={square} key={i} i={i} />
);
})}
</div>
<p
style={{
marginRight: activePlayer === "Player 1" ? "250px" : "-250px",
}}
>
{activePlayer + "'s turn"}
</p>
<p> </p>
</div>
);
};
export default Board;
这基本上是整个游戏,我在另一个像这样的文件中有一个整理功能;
export const isGameOver = (squares: String[]) => {
const won = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6],
];
for (let i = 0; i < won.length; i++) {
const [x, y, z] = won[i];
if (squares[x] && squares[x] === squares[y] && squares[y] === squares[z]) {
return squares[x];
}
}
return null;
};
完成功能也可以正常工作,但是由于 useState 正在异步工作并且我知道,所以我正在努力将它放在哪里。如果我把点击功能放在里面,它就不能反应新的状态,只能反应之前的状态。如果我只用 If 语句放在外面,它会说渲染太多,因为我正在设置获胜者等。我的意思是我还想停止游戏,停止点击事件等。找不到如何实现这一点的方法.
【问题讨论】:
标签: javascript reactjs react-hooks