显示获取的数据问题:对象作为 React child 无效 / TypeError:未定义
我想使用生命周期方法显示从 API 获取的数据。 我设法获取数据(对象)并将数据填充到状态(数组)中。但是我无法在返回部分显示值。
代码的第一部分似乎有效,为了便于阅读,我删除了错误/加载部分:
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: [], //putting data in the state
};
}
async componentDidMount() {
fetch("https://covid19.mathdro.id/api")
.then((response) => response.json())
.then(
(data) => {
this.setState({
confirmed: data.confirmed, //populate data in this.state
recovered: data.recovered,
deaths: data.deaths,
});
}
);
}
render() {
const { confirmed, recovered, deaths } = this.state;
console.log(confirmed, recovered, deaths);
...
}
export default App;
这是我尝试的第一个返回:
return ( <div> {(confirmed, recovered, deaths)} </div>);
我得到了
Error: Objects are not valid as a React child (found: object with keys {value, detail}). If you meant to render a collection of children, use an array instead.
Console.log
确实返回了对象:
Object { value: 42280709, detail: "https://covid19.mathdro.id/api/confirmed" } Object { value: 28591681, detail: "https://covid19.mathdro.id/api/recovered" } Object { value: 1145557, detail: "https://covid19.mathdro.id/api/deaths" }
顺便说一句,
console.log(confirmed.value)
没有返回任何东西,为什么?
所以我决定使用
Array.prototype.map()
:
return (
<div>
{this.state.confirmed.map(i => (<div>{i.value}</div>))}
</div>);
现在我得到了
TypeError: confirmed is undefined
我不明白这个错误,如果
console.log(confirmed)
未定义,它怎么能返回某些内容?
我探索的其他路径:使用
JSON.parse
、将键放入映射中、删除 {},..
我浏览了几个 stackoverflow 问题,但仍然不明白要更改什么: React 渲染:对象作为 React 子项无效 对象作为 React 子项无效。如果您想要渲染子项集合,请使用数组代替
有什么线索吗?谢谢!
我检查了您使用的 API,我发现
confirmed、recovered、deaths
是对象而不是数组(
这就是您收到这些错误的原因
)。您应该执行以下代码。
class App extends Component {
constructor(props) {
super(props);
this.state = { confirmed: {}, recovered: {}, deaths: {} };
}
async componentDidMount() {
fetch("https://covid19.mathdro.id/api")
.then((response) => response.json())
.then(
(data) => {
const { confirmed, recovered, deaths } = data
this.setState({ confirmed, recovered, deaths });
}
);
}
render() {
const { confirmed, recovered, deaths } = this.state;
return (
<div>
<div>Confirmed: { confirmed.value || 0}</div>
<div>Recovered: { recovered.value || 0}</div>
<div>Deaths: { deaths.value || 0 }</div>
</div>
)
}
}
export default App;
首先,您无法在 JSX 中呈现对象,它应该是一个有效的 JSX 元素,请查看 ReactNode 类型定义以获取更多信息。
您面临的第二个问题是由于您的初始状态,它是一个带有空数组的对象,名为
data
;
this.state = { data: [] };
。因此,当您尝试访问
this.state.data
的
confirmed
属性时;它失败了,因为您的数据还没有从 api 调用中传出来。
您需要做的是在渲染任何内容之前检查
this.state.data
是否具有一个名为
confirmed
的属性。
return (<div>
{this.state.confirmed && <div>
{this.state.confirmed.map(i => (<div>{i.value}</div>))}
</div>}
</div>)