为什么我的 fetch API 会调用映射一个嵌套对象,而不是另一个?
Why will my fetch API call map one nested objects, but not the other?
我正在使用 React 解析来自 NASA API 的数据,出于某种原因,我可以在 return 中映射一个嵌套对象,但不能在另一个中映射。
这是我的父组件:
import React, { useState } from 'react'
import './NasaAPI.scss'
import NasaImages from './NasaImages'
const NasaAPI = () => {
const [nasaData, setNasaData] = useState([])
const [nasaImage, setNasaImage] = useState("")
const [searchInput, setSearchInput] = useState("")
const [loading, setLoading] = useState(true)
const fetchData = async (e) => {
const data = await fetch(`https://images-api.nasa.gov/search?q=${searchInput}`)
.then(response => response.json())
.then(data => setNasaData(data.collection.items))
.catch(err => console.log(err))
.finally(setLoading(false))
}
const handleSubmit = (e) => {
e.preventDefault()
fetchData()
}
const handleChange = (e) => {
setSearchInput(e.target.value)
}
return (
<div>
<h2>Search NASA Images</h2>
<form onSubmit={handleSubmit}>
<input name="searchValue" type="text" value={searchInput} onChange={handleChange}></input>
<button value="Submit">Submit</button>
</form>
<section>
<NasaImages nasaData={nasaData} loading={loading}/>
</section>
</div>
)
}
export default NasaAPI
这是子组件中的问题所在:
import React from 'react'
const NasaImages = ({ nasaData }) => {
console.log(nasaData)
return (
<div>
<h2>This is a where the data go. </h2>
{
nasaData && nasaData.map((data, idx) => {
return (
<div key={idx}>
<p>{data.href}</p>
<div>
{/* {data.links.map((data) => {
return <p>{data.href}</p>
})} */}
{data.data.map((data) => {
return <p>{data.description}</p>
})}
</div>
</div>
)
})
}
</div>
)
}
export default NasaImages
当前配置有效,将显示 data.description (data.data.map) 映射 属性。但是,我希望它上面的注释代码能够显示 data.href (data.links.map) 属性.
JSON 看起来如下:
所以,问题是我可以映射一组属性,data.data.map,但无法访问同一对象中的另一组属性,data.links.map ,没有收到错误“TypeError:无法读取未定义的 属性 'map'”。提前致谢!
存在 data
元素但没有 links
属性,换句话说,存在一些未定义的 data.links
属性 并且您无法映射那。映射时在 data.links
上使用可选链接运算符,即 data.links?.map
。在任何可能未定义的嵌套属性上使用它。
const NasaImages = ({ nasaData = [] }) => {
return (
<div>
<h2>This is a where the data go. </h2>
{nasaData.map((data, idx) => (
<div key={idx}>
<p>{data.href}</p>
<div>
{data.links?.map((data, i) => <p key={i}>{data.href}</p>)}
{data.data?.map((data, i) => <p key={i}>{data.description}</p>)}
</div>
</div>
))}
</div>
)
}
我正在使用 React 解析来自 NASA API 的数据,出于某种原因,我可以在 return 中映射一个嵌套对象,但不能在另一个中映射。
这是我的父组件:
import React, { useState } from 'react'
import './NasaAPI.scss'
import NasaImages from './NasaImages'
const NasaAPI = () => {
const [nasaData, setNasaData] = useState([])
const [nasaImage, setNasaImage] = useState("")
const [searchInput, setSearchInput] = useState("")
const [loading, setLoading] = useState(true)
const fetchData = async (e) => {
const data = await fetch(`https://images-api.nasa.gov/search?q=${searchInput}`)
.then(response => response.json())
.then(data => setNasaData(data.collection.items))
.catch(err => console.log(err))
.finally(setLoading(false))
}
const handleSubmit = (e) => {
e.preventDefault()
fetchData()
}
const handleChange = (e) => {
setSearchInput(e.target.value)
}
return (
<div>
<h2>Search NASA Images</h2>
<form onSubmit={handleSubmit}>
<input name="searchValue" type="text" value={searchInput} onChange={handleChange}></input>
<button value="Submit">Submit</button>
</form>
<section>
<NasaImages nasaData={nasaData} loading={loading}/>
</section>
</div>
)
}
export default NasaAPI
这是子组件中的问题所在:
import React from 'react'
const NasaImages = ({ nasaData }) => {
console.log(nasaData)
return (
<div>
<h2>This is a where the data go. </h2>
{
nasaData && nasaData.map((data, idx) => {
return (
<div key={idx}>
<p>{data.href}</p>
<div>
{/* {data.links.map((data) => {
return <p>{data.href}</p>
})} */}
{data.data.map((data) => {
return <p>{data.description}</p>
})}
</div>
</div>
)
})
}
</div>
)
}
export default NasaImages
当前配置有效,将显示 data.description (data.data.map) 映射 属性。但是,我希望它上面的注释代码能够显示 data.href (data.links.map) 属性.
JSON 看起来如下:
所以,问题是我可以映射一组属性,data.data.map,但无法访问同一对象中的另一组属性,data.links.map ,没有收到错误“TypeError:无法读取未定义的 属性 'map'”。提前致谢!
存在 data
元素但没有 links
属性,换句话说,存在一些未定义的 data.links
属性 并且您无法映射那。映射时在 data.links
上使用可选链接运算符,即 data.links?.map
。在任何可能未定义的嵌套属性上使用它。
const NasaImages = ({ nasaData = [] }) => {
return (
<div>
<h2>This is a where the data go. </h2>
{nasaData.map((data, idx) => (
<div key={idx}>
<p>{data.href}</p>
<div>
{data.links?.map((data, i) => <p key={i}>{data.href}</p>)}
{data.data?.map((data, i) => <p key={i}>{data.description}</p>)}
</div>
</div>
))}
</div>
)
}