как установить значения для переменных внутри setState, если эти переменные равны нулю - PullRequest
0 голосов
/ 19 апреля 2019

Здесь я устанавливаю значения по умолчанию для переменных внутри state > currentWeather, как в следующем примере, затем снова я устанавливаю динамические значения для этих переменных, чтобы они работали для условий пользовательского поиска, когда статические значения в открытом приложении не отображаются, как я могу это исправитьтот?

class App extends Component {
  state = {
    currentWeather: {
      currentLocation: 'Colombo',
      currentDate: new Date(),
      currentTempreture: 28.3,
      currentWeatherLabel: 'rain',
      currentWind: 1.5,
      currentHumidity: 60
    }
  };

  getWeather = async e => {
    this.setState({
      currentTempreture: data.main.temp,
      currentLocation: data.name,
      currentWind: data.wind.speed,
      currentHumidity: data.main.humidity,
      currentWeatherLabel: data.weather[0].description
    });
  };

  render() {
    return (
      <div id="bsec" className="b-color body-sec">
        <div className="main-wrapper">
          <MainWidget
            location={this.state.currentLocation}
            date={this.state.currentDate}
            tempreture={this.state.currentTempreture}
            label={this.state.currentWeatherLabel}
            wind={this.state.currentWind}
            humidity={this.state.currentHumidity}
            pressure={this.state.currentPressure}
          />
        </div>
      </div>
    );
  }
}

Ответы [ 5 ]

4 голосов
/ 19 апреля 2019

Вам необходимо выполнить некоторую проверку данных, так как data.main.temp сломает ваше приложение, если main равно undefined или данные равны нулю.

this.setState({

  currentTempreture: data && data.main && data.main.temp || 'default value',    
  currentLocation: data && data.name || 'default value',
  currentWind: data && data.wind && data.wind.speed || 'default value',
  currentHumidity: data && data.main && data.main.humidity || 'default value',
  currentWeatherLabel: data && data.wat && data.weather[0].description || 'default value',

});

Например:

с проверкой данных

const data = {}

console.log(data && data.main && data.main.temp || 'default value')

Без проверки данных

const data = {}

console.log(data.main.temp ? data.main.temp : 'default value')
1 голос
/ 19 апреля 2019

как julekgwa упомяните, что вам нужно будет проверить ваши данные, иначе ваше приложение сломается, в следующем примере для получения результата используется метод get lodash :

this.setState({
 currentTempreture: _.get(data, 'main.temp', "default value"),    
 currentLocation: _.get(data, 'name', "default value"),
 currentWind: _.get(data, 'wind.speed', "default value"),
 currentHumidity: _.get(data, 'main.humidity', "default value"),
 currentWeatherLabel: _.size(data.weather) > 0 ?  data.weather[0].description : [],
});
1 голос
/ 19 апреля 2019

Итак, вы хотите обновить переменные состояния, если они нулевые.Вы можете попробовать это -

this.setState(state => ({
  currentTempreture: state.currentTempreture === null ? data.main.temp : state.currentTempreture,    
  currentLocation: state.currentLocation === null ? data.name : state.currentLocation,
  currentWind: state.currentWind === null ? data.wind.speed : state.currentWind,
  currentHumidity: state.currentHumidity === null ? data.main.humidity : state.currentHumidity,
  currentWeatherLabel: state.currentWeatherLabel === null ? data.weather[0].description : state.currentWeatherLabel,
}));
1 голос
/ 19 апреля 2019
this.setState({
 currentTempreture: data.main.temp ? data.main.temp:"static values",    
 currentLocation: data.name ? data.name :"static values",
 currentWind:data.wind.speed ? data.wind.speed : "static values",
 currentHumidity: data.main.humidity?data.main.humidity:"static values",
 currentWeatherLabel: data.weather.length>0 ? 
 data.weather[0].description : [],

});

как это вы можете установить

0 голосов
/ 19 апреля 2019

Учитывая, что ваше состояние является объектом, вы можете сделать так:

if (Object.keys(your state).length) == 0 { 
      // Do something here 
}

Или попробуйте с your.state === null

...