我遵循了ReactJS教程,这对于完成更复杂的事情非常简单。
在我的情况下,我想使用一个复杂的JSON对象,它包含一个地图,一个值,一个列表等......这是代码:
var NotificationStatus = React.createClass({
loadNotificationsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setState({data: data});
console.log(this.state.data.notificationType);
}.bind(this)
});
},
getInitialState: function() {
return {data: {}};
},
componentWillMount: function() {
this.loadNotificationsFromServer();
setInterval(this.loadNotificationsFromServer, this.props.pollInterval);
},
render: function() {
return (
<div>
<li className="dropdown-menu-title">
<span>You have {this.state.data.notificationCount} notifications</span>
</li>
<Notifications data={this.state.data.notificationType} />
</div>
);
}
});
var Notifications = React.createClass({
render: function() {
var notificationNodes = this.props.data.map(function (notif, index) {
return <Notification key={index}>{notif.type}</Notification>;
});
return <li>{notificationNodes}</li>;
}
});
var Notification = React.createClass({
render: function() {
return (
<a href="#">
<span className="icon blue"><i className={this.props.children == "user" ? 'icon-user' : 'icon-comment-alt'}></i></span>
<span className="message">{this.props.children}</span>
<span className="time">1 min</span>
</a>
);
}
});
React.renderComponent(
<NotificationStatus url="/data/notifications.json" pollInterval={2000} />,
document.getElementById('notificationbar')
);
这是来自JSON的示例:
{
"notificationCount": "1",
"notificationType": [
{
"type": "update",
"text": "New Update"
},
{
"type": "user",
"text": "New User"
}
]
}
当我尝试获取notificationType时,错误&#34; this.props.data未定义&#34;在这一点上被提出
var notificationNodes = this.props.data.map(function (notif, index) {
我真的不知道声明有什么问题,当我在ajax级别获得JSON时,我确实有一张地图(通过console.log验证)。
任何帮助都会很棒。
非常感谢。
答案 0 :(得分:8)
当您的组件首次呈现时,NotificationStatus的this.state.data
将为{}
,因为这是从getInitialState
返回的内容。这意味着当你渲染
<Notifications data={this.state.data.notificationType} />
您正在通过{}.notificationType
或undefined
:
<Notifications data={undefined} />
因此,当通知首次呈现时,this.props.data不是列表。这取决于你的应用程序这里正确的解决方案是什么,但也许你想用data: null
初始化并将其添加到NotificationStatus的渲染方法的顶部:
if (!this.state.data) {
return <div>Loading...</div>;
}
答案 1 :(得分:2)
除了Ben的观点之外,您还在componentWillMount中调用loadNotificationsFromServer。您应该调用loadNotificationsFromServer并启动componentDidMount中的任何计时器,因为您的组件尚未安装在DOM中。您可以在此处阅读更多内容:React Component Lifecycle
回顾代码,我不完全确定你的对象图应该是什么样子,但是在一个地方看起来你正试图迭代一组通知而在另一个通知中。
为了缓解Ben提到的问题,您还可以使用notificationType和count(''和0)的默认值初始化您的状态作为快速修复,但逻辑运算符也可以正常工作。