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

React Map组件报TypeError: Cannot read properties of undefined (reading 'question')如何解决

报错原因

该错误本质是Map组件接收的object属性为undefined,代码直接读取undefined.question触发了类型错误。
结合「完成最后一道题后报错」的场景,根因是记录当前题目序号的状态变量ragaca在点击提交时持续累加,最终超过了题目数组的最大下标,父组件从题目数组中取值时拿到了undefined,再传递给Map组件的object属性就触发了报错。

修复方案

方案1:组件内加非空兜底

直接在当前组件做兼容,避免属性为空时报错,有两种实现方式:

  • 使用可选链运算符做安全访问:
import React from "react";

function Map(props) {
  return (
    <div>
      <p>{props.object?.question}</p>

      {props.object?.answers?.map((e) => (
        <React.Fragment key={e.id}>
          <input
            type="radio"
            id={e.id}
            name={props.object?.id}
            value={e.correct}
          />
          <label htmlFor={e.id}>{e.answer}</label>
          <br />
        </React.Fragment>
      ))}

      <input
        type="submit"
        value="პასუხი"
        onClick={() => props.setRagaca(props.ragaca + 1)}
      />
    </div>
  );
}

export default Map;

额外说明:顺便把标签的for属性替换为React规范的htmlFor,同时给map遍历的节点加了唯一key,避免控制台抛出告警

  • 提前判断属性是否存在,为空时直接返回结束提示:
function Map(props) {
  if (!props.object) {
    return <div>所有题目已完成</div>
  }
  // 原有渲染逻辑保持不变
}

方案2:父组件侧限制序号范围

从触发逻辑根源解决问题,在点击提交累加序号时判断是否已经到达最后一题,避免序号越界:
修改提交按钮的点击事件逻辑:

<input
  type="submit"
  value="პასუხი"
  onClick={() => {
    // 父组件的题目数组总长度通过total属性传入
    if (props.ragaca < props.total - 1) {
      props.setRagaca(props.ragaca + 1)
    } else {
      // 最后一题提交后的自定义逻辑,比如跳转结果页、展示得分
      console.log('答题完成')
    }
  }}
/>

父组件调用Map时需要额外传入总长度参数:<Map object={currentQuestion} ragaca={index} setRagaca={setIndex} total={questionList.length} />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:03