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

React中useParams获取数据后解构报错:无法解构undefined的titulo属性

解决useParams获取数据后解构报错的问题

报错Cannot destructure property 'titulo' of 'actividad' as it is undefined说明actividad是undefined,也就是actividades.find(...)没有找到匹配的项。能渲染actId说明路由参数获取正常,问题出在匹配逻辑或数据校验上,以下是具体解决办法:

核心原因及修复

1. 类型不匹配(最常见)

useParams()返回的所有参数都是字符串类型,但你的infoActividades.json里的id可能是数字类型。比如json里的id是1,而actId是"1",用===全等比较会直接失败,导致find返回undefined。

修复方式:把actId转换为数字后再比较:

const actividad = actividades.find((actividad) => actividad.id === Number(actId));

如果json里的id本身是字符串,检查参数值和json里的id是否完全一致(注意大小写、空格等细节)。

2. 添加空值防护

即使匹配逻辑正确,也可能存在找不到对应数据的情况,必须先判断actividad是否存在再解构,避免报错:

// 方式1:提前判断并返回提示
if (!actividad) {
  return <div>该活动不存在</div>;
}
// 确认存在后再解构
const { titulo, descripcion, deadline, etiqueta} = actividad;

// 方式2:用默认值兜底
const { titulo, descripcion, deadline, etiqueta} = actividad || {};

3. 验证数据结构

检查infoActividades.json的结构是否正确,确保每个项都包含id、titulo等必填字段,示例结构:

[
  {
    "id": 1,
    "titulo": "示例活动",
    "descripcion": "活动描述",
    "deadline": "2021-10-10",
    "etiqueta": "学习"
  }
]

修改后的完整代码

import React from "react"; 
import { Link } from "react-router-dom";
import { useParams } from "react-router-dom";
import '../assets/css/Styles.css';
import '../assets/css/Colecciones.css';
import actividades from '../files/infoActividades.json';

function Acti() {
  const { actId } = useParams();
  // 转换类型并查找匹配项
  const actividad = actividades.find((actividad) => actividad.id === Number(actId));

  // 空值判断,避免解构报错
  if (!actividad) {
    return (
      <div className="header">
        <Link to=".." relative="path">
          <button className="btn-header">Regresar</button>
        </Link>      
        <h1 className="h1Contenido" style={{ fontFamily: 'HelveticaNeue' }}>活动不存在</h1>
      </div>
    );
  }

  const { titulo, descripcion, deadline, etiqueta} = actividad;

  return (
    <>
      <div>
        <div className="header">
          <Link to=".." relative="path">
            <button className="btn-header">
              Regresar
            </button>
          </Link>      
          <h1 className="h1Contenido" style={{ fontFamily: 'HelveticaNeue' }}>
            Desarrollo Web
          </h1>
        </div>
        <div className='main' style={{ display: 'flex' }}>
          <div className="actiCont">
            <div className="actiCont" style={{ backgroundColor: 'white' }}>
              <h1>{actId}</h1>
              <h2>{titulo}</h2>
              <p>{deadline}</p>
              <p>{descripcion}</p>
              <span>{etiqueta}</span>
            </div>
          </div>
          <div style={{ height: '300px' }}></div>
        </div>
      </div>
    </>
  )
}
export default Acti;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:33:17