Как поместить несколько запросов JSON в массив, используя setState в React

-3

Я установил состояние, называемое данными, и объявил его как пустой массив в 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));
    }

     ...
}
  • 0
    data[0] не определено, потому что массив пуст. Не знаете о вызове ajax, вы уверены, что результатом является массив?

3 ответа

1
Лучший ответ

Я уверен, что 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)
})
  • 0
    Спасибо, я отредактировал свой код так, чтобы состояние могло вместить объект. Есть ли способ поместить объект в массив, используя setState ()? Я хотел бы сохранить состояние в виде массива.
  • 0
    @ Эй, хорошо, я понимаю, что ты имеешь в виду. Пожалуйста, добавьте это к вопросу тоже
Показать ещё 1 комментарий
0

Итак, вы хотите поместить возвращенный объект в массив, добавить его?

Как насчет этого:

...
this.setState({
  data: this.state.data.concat(tempData)
});

Вы также можете нажать его в массив state.data, но требуется еще один шаг:

this.state.data.push(tempData);
this.setState({
  data: this.state.data
});

И это будет означать, чтобы изменить состояние, что не является хорошей практикой. Для этого примера это может быть хорошо, но это не очень хорошая привычка.

  • 0
    да. Это не массив, а объект json. У меня есть состояние, которое является массивом. Моя цель - поместить объект в массив, используя setState (), как определено выше в моем коде.
  • 0
    ааа, смотри мои правки @ хуй
0

Кажется, вы получаете ответ от 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])
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню