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

如何仅改变点击的选择题选项按钮颜色(而非全部按钮)

解决选择题点击选项后仅单个按钮变色的问题

问题原因

当前代码的核心问题是用单一状态isCorrectQuestion控制所有按钮的颜色——这个状态只存储"正确(1)"或"错误(2)"的数值,所有按钮都会根据这个全局值统一切换颜色,自然会出现点击一个按钮全同步变色的情况。

解决方案

需要修改状态来记录被点击选项的唯一标识(比如选项的alternative字段、数组索引),让每个按钮只在自己是被选中的选项时,才根据自身的isCorrect值显示对应颜色,未被选中的保持默认灰色。


具体修改步骤

1. 调整状态定义

把原来的isCorrectQuestion改成记录选中选项的标识,这里以选项的alternative(A/B/C/D)为例:

const questions = Questions ?? [];
// 记录选中的选项标识,初始为undefined表示未选择
const [selectedOption, setSelectedOption] = useState<string | undefined>();

2. 修改点击事件逻辑

点击按钮时,直接把当前选项的alternative值传入状态更新函数,无需单独的test函数:

onClick={() => setSelectedOption(e.alternative)}

3. 更新按钮样式判断

每个按钮独立判断自己是否是被选中的选项,再根据自身的isCorrect值设置颜色:

{questions[0].alternatives.map(e =>
  <Styles.Button
    onClick={() => setSelectedOption(e.alternative)}
    style={{
      backgroundColor:
        // 仅当当前按钮是被选中的选项时,才根据对错设置颜色
        selectedOption === e.alternative 
          ? e.isCorrect === 1 ? 'green' : 'red'
          : 'gray' // 未选中的按钮保持默认灰色
    }}
  >
    {e.answer}
  </Styles.Button>
)}

另一种实现方式(用数组索引标识)

如果不想用alternative字段,也可以用数组索引作为选中标识,逻辑完全一致:

const [selectedIndex, setSelectedIndex] = useState<number | undefined>();

{questions[0].alternatives.map((e, index) =>
  <Styles.Button
    onClick={() => setSelectedIndex(index)}
    style={{
      backgroundColor:
        selectedIndex === index 
          ? e.isCorrect === 1 ? 'green' : 'red'
          : 'gray'
    }}
  >
    {e.answer}
  </Styles.Button>
)}

核心逻辑总结

不再用全局的对错状态控制所有按钮,而是让每个按钮独立判断自己是否是用户点击的选项,再结合自身的正确属性渲染颜色,这样就只会改变被点击按钮的样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38