我在React中实现了一个小测试应用程序来通过AJAX获取数据,但它没有按照有意的方式工作,因此我得到以下错误:
Uncaught TypeError: Cannot read property 'map' of undefinedInline JSX script
代码如下:
<div id="content"></div>
<script type="text/jsx">
var Bodypart = React.createClass({
render: function() {
return (
<div>
{this.props.name}
</div>
)
}
})
var BodypartList = React.createClass({
getInitialState: function() {
return {data: []};
},
componentWillMount: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setState({bodyparts: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
render: function() {
var bodypartItems = this.state.bodyparts.map(function (bodypart) {
return (
<Bodypart
name={bodypart.name}
/>
);
});
return (
<div>
{bodypartItems}
</div>
);
}
});
React.render(
<BodypartList url="/api/bodyparts/" />,
document.getElementById('content')
);
</script>
来自/api/bodyparts/
的回复:
{
"bodyparts": [
{
"id": 1,
"name": "Face"
},
{
"id": 3,
"name": "Mouth"
},
{
"id": 2,
"name": "Nose"
}
]
}
答案 0 :(得分:7)
初始渲染时this.state.bodyparts
为undefined
,因此出现错误。
你应该回来
{bodyparts:[]}
来自getInitialState
。
同样在你的success
回调中,您应该设置状态:
this.setState(data);
因为你的api已经返回bodyparts
作为其结果的一部分。
答案 1 :(得分:0)
this.state.bodyparts
未定义。组件在ajax完成之前呈现。尝试设置初始状态