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

ReactJS中展示Coingecko API数据遇问题:无法渲染coin.image.thumb

问题原因

你遇到的报错核心原因是:组件初始化阶段coin是一个空对象,此时coin.image为undefined,尝试访问undefined.thumb就会触发"Cannot read properties of undefined"错误。而coin.name能正常显示是因为空对象下访问name只会得到undefined,React会默认渲染空内容,不会抛出错误,但嵌套属性的访问逻辑会直接断裂。

修复方案

以下三种方案都能解决这个问题,按需选择即可:

1. 使用可选链操作符(最简洁)

在访问嵌套属性时添加?.,当属性不存在时会返回undefined,不会触发报错:

<img src={coin.image?.thumb} alt={coin.name || 'Coin Thumbnail'} />

2. 利用loading状态做条件渲染

既然你已经定义了loading状态,可以在数据加载完成前不渲染图片,或者显示加载占位符:

{loading ? (
  <img src={coin.image.thumb} alt={coin.name} />
) : (
  <div className="w-16 h-16 bg-gray-200 rounded-full"></div> // 占位加载框
)}

3. 初始化时设置默认结构

在useState中给coin设置包含image的初始结构,避免嵌套属性不存在:

const [coin, setCoin] = useState({ image: { thumb: '' } })
完整修复代码示例(可选链版本)
import React, { useState, useEffect } from 'react'
import { useParams } from 'react-router-dom'
import { Navbar } from '../components/index'
import axios from 'axios'

const Coin = () => {
    const params = useParams()
    const [coin, setCoin] = useState({})
    const [loading, setLoading] = useState(false)

    const url = `https://api.coingecko.com/api/v3/coins/${params.coinId}`

    useEffect(() => {
        axios.get(url).then((res) => {
            setCoin(res.data)
            setLoading(true)
        }).catch((error) => {
            console.log(error)
        })
    }, [url]) // 加入url到依赖数组,确保params变化时重新请求数据

    useEffect(() => {
        window.scrollTo(0, 0)
    }, [])

    return (
        <div className='text-gray-700'>
            <Navbar />
            <div className='mx-auto max-w-7xl p-8'>
                <div>
                    <img src={coin.image?.thumb} alt={coin.name || 'Coin Image'} />
                </div>
            </div>
        </div>
    )
}

export default Coin

内容的提问来源于stack exchange,提问作者Jakub Polański

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:57:42