我遇到了一个奇怪的问题,找到了答案,但是我想知道幕后的原因。
我有一个react
组件,它向服务器发送请求,并在返回结果后,将其设置为组件的状态。
class Featured extends React.Component{
constructor(props){
super(props);
this.state = {
data : ['', ''],
error: null,
}
}
componentDidMount(){
axios.get('/api/featured')
.then(res=>{
let dataClone = [2];
console.log('before');
res.data.map((dt,i)=>{
dataClone[i] = dt;
});
this.setState({
data : dataClone
})
})
.catch(err=>{this.setState({error: err}); errorHandling(err)});
}
render(){
if(!this.state.error){
return(
<div>data: {this.state.data[1].title}</div>
)
}
else {
return (<div className='text-center text-warning'>There is some error loading the featured</div>)
}
}
}
这是发回的数据:
{
title : 'how to be a good programmer?',
subtitle: 'I was wondering how can i be a good programer after 10 years experience',
author : 'hamid mortazavi',
date : new Date().toLocaleDateString(),
},
{
title : 'Why are you alone?',
subtitle: 'this is going to be a long story from here, but bear with me...',
author : 'shahin ghasemi',
date : new Date().toLocaleDateString(),
}
这可以正常工作,但是,如果我更改对data
状态进行初始化的方式,它将无法正常工作。
例如,这三种方式不起作用:
this.state = {
//1:
data : new Array(2),
//2:
data : [],
//3:
data : [2]
}
这些都不起作用,例如,当我想显示this.state.data[1].title
时,它不起作用,将我丢给Uncaught TypeError: Cannot read property 'title' of undefined
。令我惊讶的是,显示this.state.data[0].title
没问题,而且看来是索引。
正如我现在所说,我找到了解决方案,但是花了我一个小时才能解决。 我只想知道原因和原因?
答案 0 :(得分:1)
这不是React的问题,而是数组项未定义的问题。
在您没有看到错误的第一个示例中,您实际上是通过执行以下操作来定义状态数组中2个项目的值
data : ['', ''],
这样,data [0]和data [1]的值将始终存在,并且除非通过服务器的数据响应进行设置,否则将始终至少具有一个空字符串的值。
在第二个示例中,您的数据对象只是一个空数组,其中没有项目([]),1个项目([2])或2个项目(new Array(2))。即使有了新的Array(2),您的数据对象项也没有定义值。尝试在控制台中运行它:
x = new Array(2)
x[0] // will return undefined
x[1] // will return undefined
答案 1 :(得分:0)
在无法正常工作的情况下,请将初始state.data设置为空数组(或者在最后一种情况下,将其设置为其中一个数字为2的数组)。调用this.state.data[1].title
时,您尝试访问的是undefined
上的属性,这会给您一个零点错误。
在对您有用的情况下,您正在尝试访问空字符串中的属性title
,该字符串将是未定义的,但不会出错,因为您正在尝试查找标题(空字符串)的定义不是不确定的。