Если оператор не работает в компоненте React

Я получаю данные из API погоды и хочу, чтобы они были анимированы с помощью этого компонента. Например, если температура выше, скажем, 20, я хочу, чтобы отображалось «const sunny». Я дошел до того, что заставил его появиться после получения данных, но оператор if не работает независимо от того, какой темп. есть, он по-прежнему вызывает переменную «облачно».

Погоду получает функция getWeather в компоненте App.jsx. Пожалуйста, помогите. Что мне не хватает?

import React, { Component } from 'react'
import ReactAnimatedWeather from 'react-animated-weather';

const sunny = {
    icon: 'CLEAR_DAY',
    color: 'red',
    size: 200,
    animate: true
  };

  const cloudy = {                                      
    icon: 'PARTLY_CLOUDY_DAY',
    color: 'blue',
    size: 200,
    animate: true
  };

export default class Display extends Component {
  constructor(props) {
    super(props)    
    this.state = {
      animationData : 
      { icon: '',
      color: '',
      size: 0,
      animate: false},
      hasrecieved : true
      }

    this.getanimation = this.getanimation.bind(this)
  }

getanimation() { 
  let animationData = this.state.animationData
if (this.state.temperature < 1) {
  animationData = sunny
} else {
 animationData = cloudy
}
  this.setState({
    animationData: animationData,
    hasrecieved: true
  })
}

componentWillReceiveProps(nextProps) { 
    if (this.props !== nextProps) {
    this.setState(nextProps)
  }
  this.getanimation()  
}

  render() {
    console.info(this.state)
    return (
        <div>
    { this.state.hasrecieved && <ReactAnimatedWeather
      icon = {this.state.animationData.icon}
      color = {this.state.animationData.color}
      size = {this.state.animationData.size}
      animate = {this.state.animationData.animate}
    />}
    </div>
    )
  }
}

Я предполагаю, что API возвращает температуру в виде строки. Я бы порекомендовал разобрать его на число и снова попробовать условие. parseFloat(string)

Chirag Ravindra 02.05.2018 10:54

@ChiragRavindra: OP использует <, который будет неявно преобразовывать.

T.J. Crowder 02.05.2018 10:58

@ T.J.Crowder, насколько я понимаю, неявное преобразование работает только тогда, когда нет единиц измерения .. Итак, "11" < 12 будет работать, а "11°C" < 12 - нет ...

Chirag Ravindra 02.05.2018 11:00

@ChiragRavindra: Верно, вы получите NaN, если невозможно проанализировать всю строку, тогда как parseFloat проанализирует начало строки.

T.J. Crowder 02.05.2018 11:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
1 182
1

Ответы 1

setState - это асинхронный. Ваш getanimation использует this.state и вызывается сразу после setState:

componentWillReceiveProps(nextProps) { 
  if (this.props !== nextProps) {
    this.setState(nextProps)
  }
  this.getanimation()  
}

Чтобы гарантировать, что он будет вызван после того, как это изменение состояния действительно было сделано, используйте второй аргумент setState:

componentWillReceiveProps(nextProps) { 
  if (this.props !== nextProps) {
    this.setState(nextProps, this.getanimation)
  } else {
    this.getanimation()
  }
}

Отдельно отметим, что this.props !== nextProps будет истинным всегда. Свойства могут быть эквивалент, но не тот же объект.

До сих пор не совсем понимаю, как это работает, но это так. Большое спасибо.

Jattsingh 06.05.2018 23:04

Другие вопросы по теме