为什么我会收到错误:TypeError:无法读取未定义的属性“map”?
2019-12-01
508
出现错误:TypeError:无法读取未定义的属性“map”。在重新加载页面之前,它工作正常。但是当我重新加载页面时出现错误。我想从数组中获取对象值。
import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import {fetchData} from '../../actions/fetchData';
class Menu extends Component {
componentDidMount() {
this.props.fetchData();
}
render() {
const {data, isFetching} = this.props.data;
if (isFetching) {
return (
<View>
<ActivityIndicator size={'large'} />
</View>
);
} else {
return (
<View
style={{
flex: 1,
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
}}>
<Text>
{data.categories.map(nm => nm.name)}
{/* {console.log("data",data.categories.map(nm => nm.name))} */}
</Text>
</View>
);
}
}
}
function mapStateToProps(state) {
return {
data: state.data,
};
}
function mapDispatchToProps(dispatch) {
return {
...bindActionCreators({fetchData}, dispatch),
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Menu);
2个回答
我不是
react-native
开发人员,但在
react
方面有一点工作经验。以下是我所能理解的内容:
this.state = {
data: this.props.data,
};
在
constructor
中的上述代码中,首先使用
state.data
进行初始化,当调用类实例时,它将是
undefined
。因为在调用第一个类时,
this.props.data
是
undefined
。
componentDidMount() {
this.props.fetchData();
}
在
constructor
的任务完成后,将执行上述代码,其数据显示在
console.log
中。但返回的数据从未分配给任何变量。这意味着,在获取数据后,
this.state.data
仍然是
undefined
。
因此,当执行
<Text>{this.state.data.data.categories.map(nm => nm.name)}</Text>
时,
this.state.data
将为 undefined`。要解决此问题,您可以尝试以下代码:
class Menu extends Component {
componentDidMount() {
this.props.fetchData();
}
render() {
return (
<View>
<Text>{this.props.data.data.categories.map(nm => nm.name)}</Text>
</View>
);
}
}
最后一件事,我强烈建议您学习 React 开发生命周期。谢谢
sabbir
2019-12-01
我之前遇到过这个问题,我通过图像数组映射解决了它,因为获取数据是异步的,似乎数据在渲染开始时不可用,并且导致映射时出错,您应该处理您的应用程序并在数据设置到状态之前防止渲染,因此实现一个检查器来查看数据在状态下是否完全可用,然后让其渲染,这是唯一的解决方案,没有别的办法
Ehsan Hejazi
2019-12-01