You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:54:08