我正在按照this page中所示的井字游戏练习来学习react .在第Wrapping up章中,额外的作业(job)之一是:
重写Board以使用两个循环来制作正方形,而不是硬编码它们.
所以我从这个开始:
function Board({ xIsNext, squares, onPlay }) {
function handleClick(i) {
if (calculateWinner(squares) || squares[i]) {
return;
}
const nextSquares = squares.slice();
if (xIsNext) {
nextSquares[i] = 'X';
} else {
nextSquares[i] = 'O';
}
onPlay(nextSquares);
}
const winner = calculateWinner(squares);
let status;
if (winner) {
status = 'Winner: ' + winner;
} else {
status = 'Next player: ' + (xIsNext ? 'X' : 'O');
}
return (
<>
<div className="status">{status}</div>
<div className="board-row">
<Square value={squares[0]} onSquareClick={() => handleClick(0)} />
<Square value={squares[1]} onSquareClick={() => handleClick(1)} />
<Square value={squares[2]} onSquareClick={() => handleClick(2)} />
</div>
<div className="board-row">
<Square value={squares[3]} onSquareClick={() => handleClick(3)} />
<Square value={squares[4]} onSquareClick={() => handleClick(4)} />
<Square value={squares[5]} onSquareClick={() => handleClick(5)} />
</div>
<div className="board-row">
<Square value={squares[6]} onSquareClick={() => handleClick(6)} />
<Square value={squares[7]} onSquareClick={() => handleClick(7)} />
<Square value={squares[8]} onSquareClick={() => handleClick(8)} />
</div>
</>
);
}
对于这一点,请参阅更改注释以了解差异:
function Board({ xIsNext, squares, onPlay }) {
function handleClick(i) {
if (squares[i] || calculateWinner(squares)) {
return;
}
const nextSquares = squares.slice();
if (xIsNext) {
nextSquares[i] = "X";
}
else {
nextSquares[i] = "O";
}
onPlay(nextSquares);
}
const winner = calculateWinner(squares);
let status;
if (winner) {
status = "Winner: " + winner;
}
else {
status = "Next player: " + (xIsNext ? "X" : "O");
}
/* CHANGES START HERE */
let content = [];
let n=0;
for (let i=0; i<3; i++) {
let row = [];
for (let j=0; j<3; j++) {
row.push(<Square key={"square-" + n} value={squares[n]} onSquareClick={() => handleClick(n)} />);
n++;
}
content.push(<div key={"row-" + i} className="board-row">{row}</div>);
}
return (
<>
<div className="status">{status}</div>
{content}
</>
);
}
电路板被正确绘制,并且根据编译器的要求,数组中元素的键也被正确生成:
然而,如果我点击一个方块,单元格就不会像它应该的那样得到X/O标志,而且游戏跟踪器只记录第一步,而忽略随后对其他方块的任何点击.
我可能会按照主要文件的建议使用.map()
,但由于作业(job)中特别提到了two loops,我不知道我做错了什么.
我也查看了this answer,但我有多余的数据,我不知道放在哪里,比如类名称和键.
提前感谢您的帮助!