React JSX中如何实现按钮点击后单个禁用?井字棋已落子格子不可点击问题
修复方案
你之前的问题出在两个地方:一是没有给每个格子单独传禁用状态,二是点击逻辑里没有做已落子判断,修改方法如下:
1. 修改Board.js
首先给handleClick增加已落子判断,避免逻辑层允许覆盖操作;其次给每个Square组件传递对应格子的禁用状态,只要格子已经有值就禁用按钮:
import React, { useState } from 'react' import Square from './Square' export default function Board () { const [xIsNext, setXIsNext] = useState(true); const [squares, setSquares] = useState(Array(9).fill()); const renderSquare = (i) => { return <Square squares={squares[i]} handleClick={()=>handleClick(i)} // 新增:当前格子有值则禁用 disabled={!!squares[i]} />; } const handleClick = (i) => { // 新增:如果当前格子已经有棋子,直接终止操作 if (squares[i]) return const newSquares = squares.slice(); newSquares[i] = xIsNext ? 'X' : 'O'; setSquares(newSquares); setXIsNext(!xIsNext); } const status = 'Next player: ' + (xIsNext ? 'X' : 'O'); return ( <div> <div className="status">{status}</div> <div className="board-row"> {renderSquare(0)} {renderSquare(1)} {renderSquare(2)} </div> <div className="board-row"> {renderSquare(3)} {renderSquare(4)} {renderSquare(5)} </div> <div className="board-row"> {renderSquare(6)} {renderSquare(7)} {renderSquare(8)} </div> </div> ); }
2. Square.js无需修改
你现有的Square组件已经接收了disabled参数绑定到按钮上,不需要额外调整。
原理说明
- 每个格子的禁用状态是独立判断的,只和当前格子自身有没有值有关,不会影响其他未落子的格子
- 逻辑层的判断是双重保障,就算按钮禁用逻辑失效,点击已落子格子也不会触发状态修改
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

