将API调用数据设置为状态,但在分配类型时遇到问题

发布于 2025-02-13 03:46:05 字数 1470 浏览 0 评论 0原文

我正在使用NASA API构建一个简单的打字稿项目。首先,我只是在我的erach.tsx组件中向单个对象提出get请求,然后尝试将数据渲染到浏览器。

API数据被保存到状态:

{
date: '2018-01-03T16:50:46.890000',
 id: 'LANDSAT/LC08/C01/T1_SR/LC08_025039_20180103', 
resource: {…}, 
service_version: 'v5000', 
url: 'https://earthengine.googleapis.com/v1alpha/project…bccd48-3aa76fabdd69b028540a8edb2800e72b:getPixels'
}

问题是,当我尝试渲染数据时,我会得到错误

对象可能是未定义的

对如何解决此问题有任何建议?我有一种与我对状态相关的类型有关的。

Earth.tsx

import { useState, useEffect,FC } from "react"
import axios, { AxiosResponse } from "axios"

const Earth = ():JSX.Element => {

    interface IEarth {
        date:string,
        id:string,
        resource:{
            dataset:string,
            planet:string
        }
        service_version: string,
        url: string
    }

    // type PhotoPayload = IEarth[]

    const [data,setData] = useState<IEarth>()
    const url = 'https://api.nasa.gov/planetary/earth/assets?lon=-95.33&lat=29.78&date=2018-01-01&&dim=0.10&api_key=DEMO_KEY'

    const getData = ():void => {
        axios.get(url)
        .then((res: AxiosResponse) => {
            setData(res.data)
        })
    }

    useEffect(() => {
        getData()
    },[])

    console.log('data', data)

    return(
        <div>
            {data.url}
        </div>
    )
}

export default Earth

I'm building a simple TypeScript project using the NASA API. To begin with I'm simply making a get request for a single object in my Earth.tsx component, and then trying to render the data to the browser.

API data being saved to state:

{
date: '2018-01-03T16:50:46.890000',
 id: 'LANDSAT/LC08/C01/T1_SR/LC08_025039_20180103', 
resource: {…}, 
service_version: 'v5000', 
url: 'https://earthengine.googleapis.com/v1alpha/project…bccd48-3aa76fabdd69b028540a8edb2800e72b:getPixels'
}

The problem is that when I try to render the data, I get the error

Object is possibly undefined

Any suggestions on how to fix this? I have a feeling it's to do with the type I've assgined to my state.

Earth.tsx

import { useState, useEffect,FC } from "react"
import axios, { AxiosResponse } from "axios"

const Earth = ():JSX.Element => {

    interface IEarth {
        date:string,
        id:string,
        resource:{
            dataset:string,
            planet:string
        }
        service_version: string,
        url: string
    }

    // type PhotoPayload = IEarth[]

    const [data,setData] = useState<IEarth>()
    const url = 'https://api.nasa.gov/planetary/earth/assets?lon=-95.33&lat=29.78&date=2018-01-01&&dim=0.10&api_key=DEMO_KEY'

    const getData = ():void => {
        axios.get(url)
        .then((res: AxiosResponse) => {
            setData(res.data)
        })
    }

    useEffect(() => {
        getData()
    },[])

    console.log('data', data)

    return(
        <div>
            {data.url}
        </div>
    )
}

export default Earth

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巴黎夜雨 2025-02-20 03:46:06

使用“ nofollow noreferrer”>可选链接 in {data.url},因此{data?.url}

?。操作员就像。链接操作员,除了
如果引用为nullish(nullundefined),则导致错误
表达式短路,返回值<代码>未定义

”


import { useState, useEffect,FC } from "react"
import axios, { AxiosResponse } from "axios"

const Earth = ():JSX.Element => {

    interface IEarth {
        date:string,
        id:string,
        resource:{
            dataset:string,
            planet:string
        }
        service_version: string,
        url: string
    }

    // type PhotoPayload = IEarth[]

    const [data,setData] = useState<IEarth>()
    const url = 'https://api.nasa.gov/planetary/earth/assets?lon=-95.33&lat=29.78&date=2018-01-01&&dim=0.10&api_key=DEMO_KEY'

    const getData = ():void => {
        axios.get(url)
        .then((res: AxiosResponse) => {
            setData(res.data)
        })
    }

    useEffect(() => {
        getData()
    },[])

    console.log('data', data)

    return(
        <div>
            {data?.url}
        </div>
    )
}

export default Earth

Use optional chaining ?. in {data.url}, so it becomes {data?.url}

The ?. operator is like the . chaining operator, except that instead
of causing an error if a reference is nullish (null or undefined), the
expression short-circuits with a return value of undefined

Codesandbox Demo


import { useState, useEffect,FC } from "react"
import axios, { AxiosResponse } from "axios"

const Earth = ():JSX.Element => {

    interface IEarth {
        date:string,
        id:string,
        resource:{
            dataset:string,
            planet:string
        }
        service_version: string,
        url: string
    }

    // type PhotoPayload = IEarth[]

    const [data,setData] = useState<IEarth>()
    const url = 'https://api.nasa.gov/planetary/earth/assets?lon=-95.33&lat=29.78&date=2018-01-01&&dim=0.10&api_key=DEMO_KEY'

    const getData = ():void => {
        axios.get(url)
        .then((res: AxiosResponse) => {
            setData(res.data)
        })
    }

    useEffect(() => {
        getData()
    },[])

    console.log('data', data)

    return(
        <div>
            {data?.url}
        </div>
    )
}

export default Earth
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文