React.js создает цикл через массив
Я пытаюсь отобразить таблицу из 10 игроков. Я получаю данные через ajax и передаю его в качестве реквизита для моего ребенка.
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>
);
}
});
Теперь мне нужен компонент списка для рендеринга игроков:
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>
)
}
});
Что дает мне Uncaught TypeError: Cannot read property 'map' of undefined
.
Я как бы не уверен, что происходит, в моем консольном журнале отображаются правильные данные, но каким-то образом я не могу получить к нему доступ в обратном порядке.
Что мне не хватает?
Ответы
Ответ 1
В компоненте CurrentGame
вам нужно изменить начальное состояние, потому что вы пытаетесь использовать цикл для participants
, но это свойство undefined
, почему вы получаете ошибку.,
getInitialState: function(){
return {
data: {
participants: []
}
};
},
также, поскольку player
в .map
есть Object
, вы должны получить от него свойства
this.props.data.participants.map(function(player) {
return <li key={player.championId}>{player.summonerName}</li>
// -------------------^^^^^^^^^^^---------^^^^^^^^^^^^^^
})
Example
Ответ 2
Как решает @Alexander, проблема заключается в одной из асинхронных данных - вы рендеринг немедленно, и вы не можете (возможно, не будете) загружать участников.
Альтернативой решению, которое они предоставили, было бы предотвращение рендеринга до тех пор, пока участники не появятся, что-то вроде этого:
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>
);
}