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

React测验应用:如何用单个State管理单选按钮的条件类名?

优化React测验选项按钮的选中状态管理

核心优化思路

不用为每个按钮单独维护State,只需要一个State记录当前选中的选项标识(如"A"/"B"/"C"/"D"),渲染时动态判断按钮是否为选中状态,从而应用高亮样式。

优化后的完整代码示例

import { useState } from 'react';

function QuizPage() {
  // 存储当前选中的选项标识
  const [selectedOption, setSelectedOption] = useState(null);
  // 原有的存储用户最终选择的State
  const [optionChosen, setOptionChosen] = useState(null);

  const handleOptionClick = (op) => {
    setSelectedOption(op);
    setOptionChosen(op);
  };

  // 可选:将当前题目选项整理为数组,简化渲染逻辑
  const currentQuestionOptions = [
    { key: "A", text: questions[currentQuestion].optionA },
    { key: "B", text: questions[currentQuestion].optionB },
    { key: "C", text: questions[currentQuestion].optionC },
    { key: "D", text: questions[currentQuestion].optionD },
  ];

  return (
    <div>
      {/* 方式1:数组循环渲染,扩展性更强 */}
      {currentQuestionOptions.map((option) => (
        <button
          key={option.key}
          // 动态判断是否添加高亮类名(示例类名为"selected")
          className={selectedOption === option.key ? "selected" : ""}
          onClick={() => handleOptionClick(option.key)}
        >
          {option.text}
        </button>
      ))}

      {/* 方式2:直接编写单个按钮,适合不想重构渲染逻辑的场景 */}
      {/* <button
        className={selectedOption === "A" ? "selected" : ""}
        onClick={() => handleOptionClick("A")}
      >
        {questions[currentQuestion].optionA}
      </button>
      <button
        className={selectedOption === "B" ? "selected" : ""}
        onClick={() => handleOptionClick("B")}
      >
        {questions[currentQuestion].optionB}
      </button>
      <button
        className={selectedOption === "C" ? "selected" : ""}
        onClick={() => handleOptionClick("C")}
      >
        {questions[currentQuestion].optionC}
      </button>
      <button
        className={selectedOption === "D" ? "selected" : ""}
        onClick={() => handleOptionClick("D")}
      >
        {questions[currentQuestion].optionD}
      </button> */}
    </div>
  );
}

关键优化点说明

  • 合并State:用单个selectedOption替代原有的多个按钮State,彻底简化状态管理,避免重复的重置逻辑。
  • 动态类名判断:每个按钮通过selectedOption === 当前选项key自动判断是否高亮,无需手动清空其他按钮状态。
  • 扩展性提升:用数组循环渲染按钮后,后续选项数量变化时,只需修改数组内容,无需调整渲染代码。
  • 简化点击逻辑:点击函数只需更新选中状态,删除了冗长的if-else分支,代码更简洁易维护。

高亮样式示例

在CSS中定义统一的高亮类样式即可:

.selected {
  background-color: #4CAF50;
  color: #fff;
  border-color: #3d8b40;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:25:30