我有一个组件,我想要映射数据数组,如下所示:
render() {
return (
<List>
{this.props.data.days.map(function(item){
return (
<ListItem>Hej</ListItem>
);
})}
</List>
);
}
props.data
是在父组件处获取的异步数据,并作为状态传递给此组件。这意味着首次呈现此组件时,this.props.data
未定义,我收到错误Cannot read property 'map' of undefined
。处理这个问题的首选方法是什么?我应该在不同的生命周期或构造函数中做些什么吗?
我没有使用Flux或Redux。
我尝试过设置默认的propTypes,如下所示:
class SingleCompetition extends Component {
static defaultProps = {
data: { days: [] },
}
render() {
let competition = this.props.data;
return (
<List heading="sunday 150 starts">
{this.props.data.days.map(function(item){
return (
<ListItem>Hej</ListItem>
);
})}
</List>
);
}
}
但后来我收到了这个错误:Cannot read property 'map' of undefined. Cannot read property '__reactInternalInstance$pnbhyoz0ysdjwgvypz8q9qkt9' of null
答案 0 :(得分:1)
我正在使用getDefaultProps
方法。
在你的情况下,它会像:
getDefaultProps: function () {
return {
data: {
days: []
}
};
},
您可以详细了解这些方法here。
<强>更新强>:
感谢您的评论,这是我对ES6的更新答案。如果您使用的是ES6,我想它应该是这样的:
class SingleCompetition extends React.Component {
static defaultProps = {
data: { days: ['monday', 'tuesday'] },
}
render() {
return (
<ul>
{this.props.data.days.map(function(day){
return <li>{day}</li>;
})}
</ul>
);
}
React.render(<SingleCompetition />, document.body);
答案 1 :(得分:1)
res/drawable-ldpi/
res/drawable-ldpi-v8/
res/drawable-ldpi-v11/
res/drawable-mdpi/
res/drawable-mdpi-v8/
res/drawable-mdpi-v11/
res/drawable-hdpi/
res/drawable-hdpi-v8/
res/drawable-hdpi-v11/
res/drawable-xhdpi/
res/drawable-xhdpi-v8/
res/drawable-xhdpi-v11/
res/drawable-xxhdpi/
res/drawable-xxhdpi-v8/
res/drawable-xxhdpi-v11/
res/layout-land
res/layout-small-port-v4
res/layout-sw600dp-v13
res/layout-w480dp-v13
res/layout-v11
res/layout-port
答案 2 :(得分:0)
你可以这样做
{this.props.data !== undefined? this.props.data.map(){}: null}
答案 3 :(得分:0)
class MyComponent extends Component {
...
}
MyComponent.defaultProps = {
data: {
days: []
}
}
或者,使用无状态功能组件:
function MyComponent({ data = { days: [] } }) {
...
}