Ich arbeite mit reactjs und kann diesen Fehler beim Versuch, JSON-Daten (entweder von einer Datei oder vom Server) anzuzeigen, nicht verhindern:
Uncaught TypeError: this.props.data.map is not a function
Ich habe angeschaut:
Reagieren Sie mit dem Code "TypeError: this.props.data.map ist keine Funktion".
React.js this.props.data.map () ist keine Funktion
Beides hat mir nicht geholfen, das Problem zu beheben. Nachdem meine Seite geladen wurde, kann ich überprüfen, ob this.data.props nicht undefiniert ist (und einen Wert hat, der dem JSON-Objekt entspricht - mit dem aufgerufen werden kann window.foo
). Es scheint also, dass es nicht rechtzeitig geladen wird, wenn es von aufgerufen wird Konversationsliste. Wie stelle ich sicher, dass die map
Methode mit den JSON-Daten und nicht mit einer undefined
Variablen arbeitet?
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')
);
}
})
BEARBEITEN: Hinzufügen von Beispielkonversationen.json
Hinweis - Der Aufruf gibt this.props.data.conversations
auch einen Fehler zurück:
var conversationNodes = this.props.data.conversations.map...
gibt den folgenden Fehler zurück:
Nicht erfasster TypeError: Die Eigenschaft 'map' von undefined kann nicht gelesen werden
Hier ist gespräche.json:
{"user_has_unread_messages":false,"unread_messages_count":0,"conversations":[{"id":18768,"last_message_snippet":"Lorem ipsum","other_user_id":10193}]}