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

React报错Cannot read properties of undefined,添加判断仍未解决

问题分析与解决方案

你遇到的Uncaught TypeError: Cannot read properties of undefined (reading 'toString')错误,不是Home组件的loading判断逻辑问题,而是MovieCard组件内部在处理传入的movie对象时,对某个undefined的属性调用了toString()方法。

具体排查与解决步骤:

  1. 检查MovieCard组件的属性访问
    打开MovieCard组件代码,找到所有调用toString()的地方,比如类似movie.someField.toString()的写法。如果someField在API返回的电影数据中是undefined或null,就会触发这个错误。
    解决方法是用**可选链操作符?.**做安全访问,或者添加空值判断:

    // 原代码示例:
    <div>{movie.release_date.toString()}</div>
    // 修改为:
    <div>{movie.release_date?.toString() || ''}</div>
    // 或者用三元判断:
    <div>{movie.release_date ? movie.release_date.toString() : ''}</div>
    
  2. 在Home组件中提前过滤无效数据
    API返回的results数组里可能存在不完整的电影对象,比如某些必填字段缺失。可以在map之前先过滤掉这些无效对象:

    {
      movieData 
        ? movieData.filter(movie => movie && movie.title && movie.release_date) // 根据实际必填字段调整
            .map((movie, key) => <MovieCard movie={movie} key={key} />) 
        : <div className="">Loading</div>
    }
    
  3. 优化state初始化值
    把movieData的初始值从null改成空数组[],这样即使在数据加载前,movieData.map()也不会报错(空数组的map操作不会执行),代码可以更简洁:

    const [movieData, getMovieData ] = useState([])
    // 对应return部分可以简化为:
    {
      movieData.length > 0 
        ? movieData.map((movie, key) => <MovieCard movie={movie} key={key} />)
        : <div className="">Loading</div>
    }
    
  4. 修复错误捕获逻辑
    你当前的catch块只是重新赋值err,没有实际处理错误。可以添加错误状态,方便调试和给用户提示:

    const [movieData, getMovieData ] = useState([])
    const [loadError, setLoadError] = useState(null)
    
    const getAllMoviesData = () => {
        axios.get(process.env.REACT_APP_MOVIES_URL)
            .then((res) => {
                const result = res.data.results
                getMovieData(result)
                setLoadError(null) // 成功获取数据时清空错误
            })
            .catch((err)=> {
                console.error('加载电影数据失败:', err)
                setLoadError('加载失败,请稍后重试')
            })
    }
    // return部分增加错误显示:
    {
      loadError 
        ? <div className="error">{loadError}</div>
        : movieData.length > 0 
            ? movieData.map((movie, key) => <MovieCard movie={movie} key={key} />)
            : <div className="">Loading</div>
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:53:09