Saya bekerja dengan reactjs dan sepertinya tidak dapat mencegah kesalahan ini ketika mencoba menampilkan data JSON (baik dari file atau server):
Uncaught TypeError: this.props.data.map is not a function
Saya telah melihat:
React code melempar "TypeError: this.props.data.map bukanlah sebuah fungsi"
React.js this.props.data.map () bukanlah sebuah fungsi
Tidak satu pun dari ini yang membantu saya memperbaiki masalah. Setelah halaman saya dimuat, saya dapat memverifikasi bahwa this.data.props tidak tidak terdefinisi (dan memang memiliki nilai yang setara dengan objek JSON - dapat memanggil dengan window.foo
), jadi sepertinya tidak memuat tepat waktu ketika dipanggil oleh ConversationList. Bagaimana cara memastikan bahwa map
metode ini berfungsi pada data JSON dan bukan undefined
variabel?
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')
);
}
})
EDIT: menambahkan contoh percakapan.json
Catatan - memanggil this.props.data.conversations
juga mengembalikan kesalahan:
var conversationNodes = this.props.data.conversations.map...
mengembalikan kesalahan berikut:
TypeError Tidak Tertangkap: Tidak dapat membaca 'peta' properti dari yang tidak ditentukan
Berikut ini Conversations.json:
{"user_has_unread_messages":false,"unread_messages_count":0,"conversations":[{"id":18768,"last_message_snippet":"Lorem ipsum","other_user_id":10193}]}