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

React中将state作为数组索引访问元素时触发undefined报错如何解决?

问题核心原因

  1. 通过e.target.dataset.id获取到的值是字符串类型,而数组索引要求是数字类型,比如你拿到的是字符串"1"而非数字1,直接作为索引访问数组无法匹配到对应元素。
  2. id的初始值为undefined,Popup组件首次渲染时会直接执行WorkData[undefined],返回结果为undefined,访问undefined的title属性就会触发报错。

解决步骤

1. 存储id时转换为数字类型

修改togglePopup函数中的赋值逻辑,把字符串id转为数字后再存入state:

const togglePopup = (e) => {
  setIsOpen(!isOpen);
  setId(Number(e.target.dataset.id));
};

2. 增加空值容错逻辑

两种方案二选一即可,也可以同时使用提升稳定性:

  • 给id设置初始默认值:
    const [id, setId] = useState(0);
    
  • 在Popup组件访问数组属性时使用可选链加兜底展示:
    <span className='popup-title'>
      {/* 可选链避免空值报错,空值时展示兜底文本 */}
      {WorkData?.[id]?.title ?? '内容加载中'}
      {id}
    </span>
    

可选优化:更稳妥的取值方式

如果后续可能调整WorkData的数组顺序,建议不要直接把id作为数组索引访问,改用find方法匹配对应id的元素,避免顺序调整后索引和id不匹配的问题:

const currentWork = WorkData.find(item => item.id === id);
// 之后访问currentWork?.title即可

额外排查点

如果修改后还是报错,确认WorkData的导入逻辑是否正确,检查导出是否为export default、导入路径是否拼写正确。

内容的提问来源于stack exchange,提问作者Jérôme BORGA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 14:24:06