Impossible de lire la propriété 'map' undefined
Je suis à la suite de la reactjs tutoriel, et je continue de courir dans un problème lors du passage de la valeur de l'état d'un composant dans un autre composant. L'erreur " Impossible de lire la propriété 'map' undefined' est levée lorsque la fonction map dans le CommentList composante est exécutée. Quelle serait la cause de la prop pour devenir non défini lors du passage de la CommentBox dans le CommentList?
var CommentList = React.createClass({
render: function() {
var commentNodes = this.props.data.map(function (comment){
return (
<div>
<h1>{comment.author} </h1>
</div>
);
});
return (
<div className="commentList">
{commentNodes}
</div>
);
}
});
var CommentBox = React.createClass({
getInitialState: function(){
return {data: []};
},
getComments: function(){
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data){
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err){
console.error(url, status, err.toString());
}.bind(this)
});
},
componentWillMount: function(){
this.getComments()
},
render: function(){
return (
<div className="commentBox">
{/*this.state.data.comments*/}
{<CommentList data={this.state.data.comments}/>}
</div>
);
}
});
React.renderComponent(
<CommentBox url="comments.json" />,
document.getElementById('content')
);
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, de définir la sécurité des données initiales:
Et vous assurer que vos données ajax.
Cela devrait fonctionner si vous suivez au-dessus de deux instructions comme La démo.
Mise à jour: vous pouvez juste envelopper les .carte de bloc avec l'instruction conditionnelle.
this.props.data
est null..map
s'attend à être appelé sur un tableau.this.props.data
est null, qui a causé la fonction map à l'échec. Mais ce que je ne comprends pas, c'est que le tutoriel code fonctionne sans la clause if. Pourquoithis.props.data
n'est pas nulle dans le tutoriel?this.props.data
est peuplée par la requête AJAX. L'AJAX est asynchrone, donc si le composant est rendu avant que les données sont remplies,this.props.data
sera nulle et vous obtiendrez l'erreur. Est-il logique?var commentNodes = this.props.data && this.props.data.map(function (comment){ return ( <div> <h1>{comment.author}</h1> </div> ); });
Je pense que vous avez oublié de changer
à
dans la fonction rendu de CommentBox. J'ai fait la même erreur lorsque j'étais en suivant le tutoriel. Ainsi, l'ensemble de la fonction rendu devrait ressembler à
au lieu de
Vous avez besoin de mettre les données avant de les rendre
Devrait ressembler à ceci:
Au lieu de cela:
L'erreur
"Cannot read property 'map' of undefined"
sera présente si il y a une erreur dans le"this.props.data"
ou il n'y a pas d'accessoires.tableau de données.Mieux de mettre une condition pour vérifier que le tableau comme