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.
Vous devez vous connecter pour publier un commentaire.
La
.map
fonction n'est disponible que sur le tableau.Il ressemble à
data
n'est pas dans le format que vous attendez qu'il soit (c'est {} mais vous attendez []).devrait être
Vérifier ce type de "données" est en cours de mis à, et assurez-vous que c'est un tableau.
Code modifié avec quelques recommandations (propType de la validation et de la fonction clearInterval):
ce qui a fonctionné pour moi est de convertir les accessoires.les données d'un tableau à l'aide
data = Array.from(props.data);
ensuite, j'ai pu utiliser le
data.map()
fonctionPlus généralement, vous pouvez également convertir les nouvelles données dans un tableau et d'utiliser quelque chose comme concat:
Ce modèle est en fait utilisé dans Facebook la ToDo de démonstration de l'application (voir la section "Demande") à https://facebook.github.io/react/.
Vous n'avez pas besoin d'un tableau pour le faire.
Cela se produit parce que le composant est rendu avant le async données arrivée, vous devez les maîtriser avant de rendre.
Je l'ai résolu de cette façon:
this.props && this.props.partners.length > 0 ?
essayer
componentDidMount()
cycle de vie lors de l'extraction de données