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

React Hooks实现条件按钮可见性:React游戏中仅在玩家失败时显示重置按钮的实现问题

解决重置按钮仅在游戏失败时显示的问题

Got it! 既然你已经在用gameStatus状态跟踪游戏状态了,这个需求用React的条件渲染就能轻松实现,不用额外复杂的逻辑。我来帮你调整代码:

步骤1:确认gameStatus的State定义

首先确保你已经在组件顶部声明了gameStatus的useState(如果还没加的话):

import { useState } from 'react';

// 在组件内部
const [gameStatus, setGameStatus] = useState("Game in progress");

步骤2:给按钮添加条件渲染

你只需要在渲染按钮的时候,判断gameStatus是否为"You Lost!",只有满足条件时才渲染按钮。React里可以用&&运算符实现简洁的条件渲染:

{gameStatus === "You Lost!" && (
  <button onClick={refreshGame} className="btn-refresh btn-outline-danger">
    Play Again?
  </button>
)}

完整调整后的相关代码片段

把你的按钮部分替换成上面的代码,结合你现有的函数,整体大概是这样:

import { useState } from 'react';

// 组件内部
const [gameStatus, setGameStatus] = useState("Game in progress");
const [boardData, setBoardData] = useState(initBoardData(props.height, props.width, props.mines));
const [mineCount, setMineCount] = useState(10);

function handleCellClick(x, y) {
  let updatedData = [...boardData];
  // check if revealed. return if true.
  if (updatedData[x][y].isRevealed || updatedData[x][y].isFlagged) return null;
  // check if mine. game over if true
  if (updatedData[x][y].isMine) {
    setGameStatus("You Lost!");
    revealBoard();
  }
}

function refreshGame() {
  setBoardData(initBoardData(props.height, props.width, props.mines));
  setGameStatus("Game in progress");
  setMineCount(10);
}

// 渲染部分
return (
  <div>
    {/* 其他游戏界面元素 */}
    {gameStatus === "You Lost!" && (
      <button onClick={refreshGame} className="btn-refresh btn-outline-danger">
        Play Again?
      </button>
    )}
  </div>
);

扩展小提示

如果之后你想在玩家获胜时也显示重置按钮,只需要扩展条件就行:

{(gameStatus === "You Lost!" || gameStatus === "You Won!") && (
  <button onClick={refreshGame} className="btn-refresh btn-outline-danger">
    Play Again?
  </button>
)}

这样按钮就只会在你想要的状态下出现啦,是不是很简单😉

内容的提问来源于stack exchange,提问作者Louyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:57:41