TypeError:未定义不是对象(评估'对象['body']')
2020-12-12
3243
我从服务器获取了一个数组。 这是数组:
[{"body":"one"},{"body":"two"},{"body":"three"}]
在 Home2 组件中:
import React, { Component } from 'react';
class Home2 extends Component {
constructor() {
super()
this.state={
status:''
}
}
componentDidMount(){
let store = JSON.parse(localStorage.getItem('login'))
var url = 'http://127.0.0.1:8000/myapi/allpost/?format=json'
fetch(url,{
method:'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Token '+store.token
}
})
.then(res=>res.json().then(result=>{
this.setState({status: result})
}))
}
render() {
var list = this.state.status
var object = list[0]
console.log(object['body'])// <-- what is the problem?
return (
<div>
<h1>Hello</h1>
</div>
);
}
}
export default Home2;
当代码运行时,它显示 TypeError: undefined 不是对象(评估'object['body']')
问题在哪里? 如何 console.log'one'?
2个回答
正如人们在评论中指出的那样,初始
render
是在
componentDidMount
之前完成的,所以这就是您收到错误的原因
为了解决这个问题,您可以
return
一些
default
值(即
Loading...
div
)以防
this.state.status
尚未收到响应:
render() {
var list = this.state.status
var object = list[0]
if (!object) {
return (
<div>
Loading...
</div>
)
}
console.log(object['body'])// <-- what is the problem?
return (
<div>
<h1>Hello</h1>
</div>
);
}
我还发现了这个有趣的答案,它更多地解释了
initial render
和
React's
生命周期:
https://stackoverflow.com/a/45343644/5745962
Turtlean
2020-12-12
您的 render 方法在 componentDidMount 方法之前被调用。因此,在尝试访问对象属性之前,您需要检查对象是否存在。
此外,您还需要决定要在状态中设置哪种类型的值(它是字符串还是数组?从您的代码来看,它似乎应该是一个对象数组 )
尝试这样做:
import React, { Component } from 'react';
class Home2 extends Component {
constructor() {
super()
this.state={
status:[]
}
}
componentDidMount(){
let store = JSON.parse(localStorage.getItem('login'))
var url = 'http://127.0.0.1:8000/myapi/allpost/?format=json'
fetch(url,{
method:'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Token '+store.token
}
})
.then(res=>res.json().then(result=>{
this.setState({status: result})
}))
}
render() {
if(this.state.status.length){
var list = this.state.status
var object = list[0]
console.log(object['body'])// <-- what is the problem?
return (
<div>
<h1>Hello</h1>
</div>
);
}
else {
return null; //or return in here some kind of loader
}
}
}
export default Home2;
Ran Marciano
2020-12-12