J'essaie d'afficher une table de 10 joueurs. Je reçois les données de via ajax et je les passe comme des accessoires à mon enfant.
var CurrentGame = React.createClass({ // get game info loadGameData: function() { $.ajax({ url: '/example.json', dataType: 'json', success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error('#GET Error', status, err.toString()); }.bind(this) }); }, getInitialState: function(){ return {data: []}; }, componentDidMount: function() { this.loadGameData(); }, render: function() { return ( <div className="CurrentGame"> <h1> Current Game Information</h1> <PlayerList data={this.state.data}/> </div> ); } });
Maintenant, j'ai besoin d'un composant de liste pour rendre les joueurs:
var PlayerList = React.createClass({ render: function() { // This prints the correct data console.log(this.props.data); return ( <ul className="PlayerList"> // I'm the Player List {this.props.data} // <Player author="The Mini John" /> { this.props.data.participants.map(function(player) { return <li key={player}>{player}</li> }) } </ul> ) } });
Ce qui me donne un Uncaught TypeError: Cannot read property 'map' of undefined
.
Je ne doute pas de ce qui se passe, mon journal de la console affiche les données correctes, mais d'une certaine manière, je ne peux pas y accéder dans le retour.
Qu'est-ce qui me manque?
Dans le composant CurrentGame
, vous devez modifier l'état initial car vous essayez d'utiliser une boucle pour les participants
mais cette propriété est undefined
c'est pourquoi vous obtenez une erreur.
getInitialState: function(){ return { data: { participants: [] } }; },
Aussi, en tant que player
dans .map
is Object
vous devriez en obtenir des propriétés
this.props.data.participants.map(function(player) { return <li key={player.championId}>{player.summonerName}</li> // -------------------^^^^^^^^^^^---------^^^^^^^^^^^^^^ })
Example
Comme @Alexander résout, le problème est celui de la charge de données asynchrones – vous rendez immédiatement et vous ne pouvez (probablement pas) avoir les participants chargés.
L'alternative à la solution qu'ils ont fournie serait d'empêcher le rendu jusqu'à ce que les participants existent, quelque chose comme ceci:
render: function() { if (!this.props.data.participants) { return null; } return ( <ul className="PlayerList"> // I'm the Player List {this.props.data} // <Player author="The Mini John" /> { this.props.data.participants.map(function(player) { return <li key={player}>{player}</li> }) } </ul> ); }