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

Shadcn RadioGroup相邻题目相同选项选中状态异常问题排查

问题原因分析
  • React DOM复用导致状态残留:RadioGroupItem的key使用了answerText,当不同题目存在相同文本的选项时,React会判定这是同一DOM元素并复用,之前题目的选中状态会被带到新题目上。
  • HTML id重复违反规范:RadioGroupItem的id同样使用answerText,不同题目相同文本的选项会出现重复id,导致<label>与单选框的关联混乱,干扰浏览器对选中状态的管理。
  • RadioGroup状态未强制重置:切换题目时,若新题目无已保存答案,RadioGroup的value会变为undefined,此时浏览器可能复用之前DOM的选中状态,而非重置为未选中。
修复方案

1. 确保选项的key和id全局唯一

修改RadioGroupItem的渲染代码,将key和id结合当前题目索引(或题目唯一标识),彻底避免重复:

<div key={`${questionIndex}-${answerText}`}>
  <RadioGroupItem
    value={answerText}
    disabled={props.savedAnswers[questionIndex]?.checked}
    id={`${questionIndex}-${answerText}`}
  />
  <Label htmlFor={`${questionIndex}-${answerText}`}>{answerText}</Label>
</div>

2. 强制RadioGroup随题目切换重新渲染

给RadioGroup添加key={questionIndex},确保切换题目时组件完全重新渲染,彻底重置状态:

<RadioGroup
  key={questionIndex}
  value={props.savedAnswers[questionIndex]?.answer}
  onValueChange={(chosenAnswer) => {
    props.saveAnswer(chosenAnswer)
  }}
>
  {choiceElements}
</RadioGroup>

3. 兜底处理未保存答案的情况

在RadioGroup的value属性中,当无已保存答案时明确设置为undefined,避免状态歧义:

value={props.savedAnswers[questionIndex]?.answer ?? undefined}
额外优化提示
  • 若题目有唯一ID,可给SavedAnswers的每个题目答案增加questionId字段,替代仅依赖索引的存储方式,避免题目顺序调整导致的答案错位。
  • 切换题目时,可在setQuestionIndex的回调中清空临时状态(如果存在),进一步避免状态残留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:07:49