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

React动态表单如何实现每个单选问题仅可选一个选项不冲突?

问题根因

HTML 原生单选框的互斥逻辑是:name属性完全相同的单选框会被识别为同一组,同一组内最多只能有一个选项被选中。你当前所有单选框的name都硬编码为固定值radioBtn,导致所有问题的单选框都被归到了同一组,因此选第二个问题的选项时会自动取消第一个问题的选中状态。

修复方案

将单选框的name属性替换为每个问题独有的标识,保证同一问题下的所有单选框name相同,不同问题的name不同即可。你代码中已经携带了问题唯一标识question.id,直接用它拼接生成name值即可。

修改后的RadioBtn组件代码如下:

import React, { useContext } from "react";
import { FormContext } from "./FormContext";

const RadioBtn = ({ question, handleChange }) => {
  console.log("id", question.id);
  return (
    <div>
      <label>{question.text}</label>
      <label style={{ color: "gray", fontSize: "12" }}>
        {question.helptext ? question.helptext : null}
      </label>
      {question.list.map((el, index) => (
        // 补充map的key属性,避免React渲染警告
        <div key={`${question.id}_opt_${index}`}>
          <label>{el}</label>
          <input
            type="radio"
            // 替换为动态生成的唯一name,同一问题的单选框归属同一组
            name={`radio_${question.id}`}
            value={el}
            onChange={(e) => handleChange(question.id, e)}
          />
        </div>
      ))}
    </div>
  );
};

export default RadioBtn;

补充优化点:原代码中map遍历没有加key属性,新增了key值避免React渲染警告,不影响原有单选逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:45:03