Réagir JS - Uncaught TypeError: ce.accessoires de jeu.les données.la carte n'est pas une fonction

Je travaille avec reactjs et ne semblent pas empêcher cette erreur quand j'essaie d'afficher les données json (soit à partir d'un fichier ou d'un serveur):

Uncaught TypeError: this.props.data.map is not a function

J'ai regardé:

Réagir code lancer “TypeError: ce.accessoires de jeu.les données.la carte n'est pas une fonction”

React.js c'.accessoires de jeu.les données.map() n'est pas une fonction

Aucune de ces m'a aidé à résoudre le problème. Après mon chargement de la page, je peux confirmer que ce.les données.les accessoires n'est pas indéfini (et n'ont une valeur équivalente à l'objet json - pouvez appeler avec window.foo), de sorte qu'il semble qu'il n'est pas chargé dans le temps lorsqu'il est appelé par ConversationList. Comment faire en sorte que le map méthode est de travailler sur les données json et non pas un undefined variable?

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: ajout de l'échantillon des conversations.json

Remarque - l'appel de this.props.data.conversations également retourne une erreur:

var conversationNodes = this.props.data.conversations.map...

retourne

Uncaught TypeError: Cannot read property 'map' of undefined

Voici les conversations.json:

{"user_has_unread_messages":false,"unread_messages_count":0,"conversations":[{"id":18768,"last_message_snippet":"Lorem ipsum","other_user_id":10193}]}

  • pouvez-vous poster un exemple de conversations.json?
  • Ajouté. Merci beaucoup!
  • J'ai mis à jour la réponse. Aussi, quelques recommandations: ajouter propTypes: { données: Réagir.PropTypes.array } à ConversationList pour vérifier les données de type, et ajouter un componentWillUnmount: fn() que "la fonction clearInterval" l'intervalle dans ConversationBox.