Я установил состояние, называемое данными, и объявил его как пустой массив в getInitialState(). Кроме того, я сделал ajax-вызов и приобрел JSON взамен в компонентеDidMount().
Как вы нажимаете несколько запросов JSON на массив, называемый данными, используя метод setState?
var Forecast = React.createClass({
getInitialState() {
return {
data: []
}
},
componentDidMount: function() {
this.serverRequest = $.get('http://api.openweathermap.org/data/2.5/weather?zip=3000,au&appid=005fa98ae858a29acf836ecdefac0411', function(result) {
var tempData = result;
this.setState({
// Is there any way to push multiple JSON into an array?
// below line of code is my attempt
data: tempData
});
}.bind(this));
}
...
}
Я уверен, что jQuery не автоматически конвертирует в массив для вас:
this.serverRequest = $.get('http://api.openweathermap.org/data/2.5/weather?zip=3000,au&appid=005fa98ae858a29acf836ecdefac0411', function(result) {
var tempData = JSON.parse(result);
this.setState({
data: tempData // reset the data
});
}.bind(this));
Что-то в этом роде будет работать
EDIT: вы не следуете протоколу API. Я вручную набрал его в браузере и получил этот результат:
{"coord":{"lon":144.96,"lat":-37.81},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"stations","main":{"temp":283.48,"pressure":1032,"humidity":76,"temp_min":282.15,"temp_max":285.15},"visibility":10000,"wind":{"speed":4.6,"deg":360},"clouds":{"all":75},"dt":1497828600,"sys":{"type":1,"id":8201,"message":0.0048,"country":"AU","sunrise":1497821707,"sunset":1497856068},"id":0,"name":"Melbourne","cod":200}
Это явно не массив (поэтому вы не можете сказать data[0]
)
Если вы хотите получить доступ к объекту JSON, выполните следующие действия:
console.log(data["coord"]);//this will return {"lon":144.96,"lat":-37.81}
EDIT: если вы хотите сохранить список запросов, вам необходимо сделать следующее:
this.setState({
data: this.state.data.concat(tempData)
})
Итак, вы хотите поместить возвращенный объект в массив, добавить его?
Как насчет этого:
...
this.setState({
data: this.state.data.concat(tempData)
});
Вы также можете нажать его в массив state.data
, но требуется еще один шаг:
this.state.data.push(tempData);
this.setState({
data: this.state.data
});
И это будет означать, чтобы изменить состояние, что не является хорошей практикой. Для этого примера это может быть хорошо, но это не очень хорошая привычка.
Кажется, вы получаете ответ от api.openweathermap.org как обычный объект JavaScript вместо массива. Таким образом, вам придется изменить исходное состояние и console.log
в методе render
соответственно.
getInitialState() {
return {
data: null
}
}
render() {
console.log(this.state.data);
//...
})
Если вы хотите поместить свой ответ в массив data
в состоянии, используйте concat
.
this.setState({
data: this.state.data.concat([tempData])
});
data[0]
не определено, потому что массив пуст. Не знаете о вызове ajax, вы уверены, что результатом является массив?