【发布时间】:2020-05-31 11:25:27
【问题描述】:
我正在使用SpaceX API 来构建个人项目。我正在使用 React Router 来动态加载组件,而不是刷新整个网站。
这是我试图输出一些数据的LaunchDetails 组件:
import React, { Component } from 'react'
class LaunchDetail extends Component {
state = {
launch: []
}
async componentDidMount () {
try {
const res = await fetch(`https://api.spacexdata.com/v3/launches/${this.props.match.params.flight_number}`)
const data = await res.json()
this.setState({
launch: data,
rocket: data.rocket
})
} catch (e) {
console.log(e)
}
}
render () {
const { launch, rocket } = this.state
console.log(rocket)
return (
<div>
<div>
<h1>{launch.mission_name}</h1>
<p>SpaceX Flight Number: {launch.flight_number}</p>
<p>Launched: {launch.launch_year}</p>
<p>Rocket: {rocket.rocket_name}, {rocket.rocket_type}</p>
</div>
</div>
)
}
}
export default LaunchDetail
像launch.mission_name 这样深一层的数据正在正确显示...但是,当我尝试向下一层,比如rocket.rocket_name (eg: launch.rocket.rocket_name) 时,它会引发上述错误。
奇怪的是,这在另一个组件中有效,但它使用了不同的端点(所有数据),我正在通过它进行映射。不知道我在这个组件中调用数据的方式是否应该归咎于......
有人知道为什么会发生这种情况吗?
编辑:收到一些 cmets 后,我已将代码更新为更简单,但错误仍然存在:
import React, { Component } from 'react'
class LaunchDetail extends Component {
state = {
launch: []
}
async componentDidMount () {
try {
const res = await fetch(`https://api.spacexdata.com/v3/launches/${this.props.match.params.flight_number}`)
const data = await res.json()
this.setState({
launch: data
})
} catch (e) {
console.log(e)
}
}
render () {
const { launch } = this.state
return (
<div>
<div>
<h1>{launch.mission_name}</h1>
<p>SpaceX Flight Number: {launch.flight_number}</p>
<p>Launched: {launch.launch_year}</p>
<p>Rocket: {launch.rocket.rocket_name}, {launch.rocket_type}</p>
</div>
</div>
)
}
}
export default LaunchDetail
【问题讨论】:
-
我很确定这不是由“3 级深度”属性引起的,但在您的渲染中更是如此:
rocket.rocket_name。火箭最初并未在状态中定义,因此this.state.rocket将未定义,并且它的访问子属性将给出您得到的错误。您在componentDidMount中获取数据,但该生命周期方法在第一次渲染之后被调用。所以如果你应该有一个渲染的加载状态(当数据被获取时),最好是状态的默认值 -
尝试在初始
state = { launch: [] }中初始化rocket -
好的,所以我在状态中添加了
rocket,仍然是同样的错误。我现在已将其删除,以便它现在引用launch.rocket.rocket_name并且错误仍然存在......
标签: reactjs api react-router