reactjs render() не запускается после решения promise.setState переназначается

#javascript #reactjs #components #render #setstate

#javascript #reactjs #Компоненты #визуализация #setstate

Вопрос:

У меня есть функция ниже, которая устанавливает initialState, а затем выполняет вызов api с componentWillMount и fetchData для присвоения данных this.state . Однако, когда this.setState() выполняется, функция рендеринга не запускается с новыми данными this.state, моя функция приведена ниже:

 var Home = React.createClass({
  getInitialState: function() {
    return {
      city: '',
      weather: '',
      temperature: 0,
      humidity: 0,
      wind: 0,
    }
  },
  fetchData: function() {
    apiHelpers.getCityInfo()
    .then(function (response){
      this.setState({ data: response
      })
    }.bind(this))
  },
  componentWillMount: function(){
    this.fetchData();
  },
  render: function () {
    return (
      <div className="container">
      <Cities data={this.state.data} />
      </div>
    )
  }
});
  

Комментарии:

1. как вы узнали, что рендеринг не запускается? может быть, он запускается, но выдает тот же результат?

2. Привет, хорошо, я вставил консоль. войдите в fetchData и в render, и обещание будет выполнено, setState выполняется, однако метод render не запускается повторно и не обновляется с новыми значениями this.state

3. Что ж, тогда ответ должен вам помочь. componentWillMount используется очень редко.

Ответ №1:

data В начальном состоянии нет. Измените свой код следующим образом-

 fetchData: function() {
    apiHelpers.getCityInfo()
     .then(function (response){
      this.setState({
          city: response.city,
          weather: response.weather,
          temperature: response.temperature,
          humidity: response.humidity,
          wind: response.wind,
       })
    }.bind(this))
  },
  

ожидаемый ответ вашего api содержит объект в виде города, погоды … и так далее..

Ответ №2:

Согласно документам react

componentWillMount вызывается один раз, как на client and server , непосредственно перед началом первоначального рендеринга. Если вы вызовете setState в рамках этого метода, render() он увидит обновленное состояние и будет выполнен только once несмотря на изменение состояния.

Чтобы решить эту проблему, вместо componentWillMount использования componentDidMount . Поскольку вы обновляете ответ в переменной состояния data , сначала определите его, а затем не нужно определять другие переменные состояния, просто передайте данные в child component и обновите состояние, как вы делаете сейчас.

 var Home = React.createClass({
  getInitialState: function() {
    return {
      data: ''
    }
  },
  fetchData: function() {
    apiHelpers.getCityInfo()
    .then(function (response){
      this.setState({ data: response
      })
    }.bind(this))
  },
  componentDidMount: function(){
    this.fetchData();
  },
  render: function () {
    return (
      <div className="container">
      <Cities data={this.state.data} />
      </div>
    )
  }
});
  

Комментарии:

1. Привет, Шубхам, componentDidMount() вообще не запускает функцию fetchData .

2. Вы пробовали console.log() в функцию fetchData и проверяли, выполняется ли она

3. Привет, да, совместно componentDidMount и componentWillMount не выполняют функцию fetchData

4. Вы можете проверить, не выполняется ли fetchdata или apihelpers.getcityinfo

5. он запускает fetchData и apihelpers, однако render() запускается до того, как обещание apiHelpers будет выполнено, после того, как обещание будет выполнено, render() больше не запускается