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

React中通过Props修改HTML元素值的实现问题

问题分析与解决方案

你的错误根源在于直接在组件渲染阶段操作DOM——React组件还没完成渲染时,document.getElementsByTagName("input")根本拿不到当前组件里的输入元素,自然会出现下标访问未定义的错误。而且这种全局获取input的方式,在多个Question组件存在时还会彻底混乱,完全不符合React的状态管理思路。

下面是具体的重构方案:


1. 重构Question组件:用props直接定义正确选项

不要事后修改DOM的value,直接在渲染时就把正确选项的value设为"correct",其他选项设为"wrong"即可:

export default function Question(props) {
  // 映射选项与对应状态(正确/错误)
  const options = props.options.map((option, index) => ({
    value: index === parseInt(props.correctChoice) ? "correct" : "wrong",
    text: option
  }));

  return (
    <>
      <p>What is {props.equation}</p>
      {options.map((opt, idx) => (
        <div key={idx}>
          <input
            type="radio"
            name={`q${props.questionId}`} // 每个题目用唯一name,避免单选组冲突
            value={opt.value}
            onChange={() => props.onAnswerChange(props.questionId, opt.value)}
          />
          {opt.text}
        </div>
      ))}
      <br />
    </>
  );
}

2. 父组件Quiz管理状态,统计正确答案

父组件维护所有题目的选中状态,点击统计按钮时直接基于状态计算选中值为"correct"的数量:

import { useState } from "react";
import Question from "./Question";

export default function Quiz() {
  // 存储每个题目的选中答案,key为题目ID,value为选中的状态值
  const [answers, setAnswers] = useState({});
  // 示例题目数据
  const questions = [
    {
      id: 1,
      equation: "2 + 2",
      options: ["4", "3", "5", "2"],
      correctChoice: 0 // 正确选项的下标
    },
    {
      id: 2,
      equation: "5 - 3",
      options: ["1", "2", "3", "4"],
      correctChoice: 1
    }
  ];

  // 处理单个题目答案变更
  const handleAnswerChange = (questionId, selectedValue) => {
    setAnswers(prev => ({
      ...prev,
      [questionId]: selectedValue
    }));
  };

  // 统计正确答案数量
  const countCorrectAnswers = () => {
    return Object.values(answers).filter(val => val === "correct").length;
  };

  return (
    <div>
      {questions.map(q => (
        <Question
          key={q.id}
          questionId={q.id}
          equation={q.equation}
          options={q.options}
          correctChoice={q.correctChoice}
          onAnswerChange={handleAnswerChange}
        />
      ))}
      <button onClick={() => alert(`正确答案数量:${countCorrectAnswers()}`)}>
        统计得分
      </button>
    </div>
  );
}

核心改进点

  • 彻底抛弃DOM操作,用React的状态和props管理数据,符合单向数据流理念
  • 每个题目使用唯一name属性,避免不同题目的单选组互相干扰
  • 统计逻辑基于状态计算,无需查询DOM,更可靠且易于维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:10:11