Tôi đang làm việc với reactjs và dường như không thể ngăn được lỗi này khi cố gắng hiển thị dữ liệu JSON (từ tệp hoặc máy chủ):
Uncaught TypeError: this.props.data.map is not a function
Tôi đã xem:
Ném mã phản ứng “TypeError: this.props.data.map không phải là một hàm”
React.js this.props.data.map () không phải là một hàm
Cả hai điều này đều không giúp tôi khắc phục sự cố. Sau khi trang của tôi tải, tôi có thể xác minh rằng this.data.props không phải là không xác định (và có giá trị tương đương với đối tượng JSON - có thể gọi bằng window.foo
), vì vậy có vẻ như nó không tải đúng lúc khi nó được gọi bằng ConversationList. Làm cách nào để đảm bảo rằng map
phương thức đang hoạt động trên dữ liệu JSON chứ không phải một undefined
biến?
var converter = new Showdown.converter();
var Conversation = React.createClass({
render: function() {
var rawMarkup = converter.makeHtml(this.props.children.toString());
return (
<div className="conversation panel panel-default">
<div className="panel-heading">
<h3 className="panel-title">
{this.props.id}
{this.props.last_message_snippet}
{this.props.other_user_id}
</h3>
</div>
<div className="panel-body">
<span dangerouslySetInnerHTML={{__html: rawMarkup}} />
</div>
</div>
);
}
});
var ConversationList = React.createClass({
render: function() {
window.foo = this.props.data;
var conversationNodes = this.props.data.map(function(conversation, index) {
return (
<Conversation id={conversation.id} key={index}>
last_message_snippet={conversation.last_message_snippet}
other_user_id={conversation.other_user_id}
</Conversation>
);
});
return (
<div className="conversationList">
{conversationNodes}
</div>
);
}
});
var ConversationBox = React.createClass({
loadConversationsFromServer: function() {
return $.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentDidMount: function() {
this.loadConversationsFromServer();
setInterval(this.loadConversationsFromServer, this.props.pollInterval);
},
render: function() {
return (
<div className="conversationBox">
<h1>Conversations</h1>
<ConversationList data={this.state.data} />
</div>
);
}
});
$(document).on("page:change", function() {
var $content = $("#content");
if ($content.length > 0) {
React.render(
<ConversationBox url="/conversations.json" pollInterval={20000} />,
document.getElementById('content')
);
}
})
CHỈNH SỬA: thêm các cuộc hội thoại mẫu.json
Lưu ý - việc gọi this.props.data.conversations
cũng trả về lỗi:
var conversationNodes = this.props.data.conversations.map...
trả về lỗi sau:
Uncaught TypeError: Không thể đọc thuộc tính 'bản đồ' của undefined
Đây là cuộc trò chuyện.json:
{"user_has_unread_messages":false,"unread_messages_count":0,"conversations":[{"id":18768,"last_message_snippet":"Lorem ipsum","other_user_id":10193}]}