You need to enable JavaScript to run this app. React调用时间API后报Cannot read property 'substr' of undefined求助
优惠活动
大模型
产品
解决方案
定价
更多

React调用时间API后报Cannot read property 'substr' of undefined求助

问题根因分析
  • 首次渲染时数据未返回:你在App组件中给time的初始值设为了空数组[],而接口请求是在组件挂载后(useEffect的回调)才异步执行的,所以第一次渲染Clock组件时,time还没有拿到接口返回的对象,此时time.datetime为undefined,调用substr方法自然就会抛出类型错误。
  • 额外语法问题:Clock组件的JSX结构多了一个多余的</div>闭合标签,运行时也会触发语法报错。
修复方案

方案1:调整初始值+上层条件渲染

修改App组件代码,先给time设置合理的初始值,数据加载完成前渲染加载状态,避免把空值传给Clock组件:

import { useState, useEffect } from 'react';
function App() {
  // 初始值设为null,更符合后续要存储对象的语义
  const [time, setTime] = useState(null);

  const getTime = () =>
    fetch("http://worldtimeapi.org/api/ip")
      .then((res) => res.json())
      .then((data) => setTime(data));

  useEffect(getTime, []);

  // 数据加载完成前渲染加载提示
  return time ? <Clock time={time} /> : <p>时间加载中...</p>
}

方案2:Clock组件内层做兼容处理

也可以直接在Clock组件中对值做非空判断,同时修复多余的div标签问题:

export default function Clock({ time }) {
  // 用可选链避免调用undefined的方法,兜底可以设为空字符串或者默认提示
  const extractTime = time?.datetime?.substr(12, 4) || '';

  return (
    <div className="time-container">
      <p className="time">{extractTime}</p>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:06:01