React Native Redux: this.setState не меняет состояние

this.setState({device}) вообще не обновляет состояние, если только я не заставлю его с помощью «this.state.device = __», однако это все равно будет проблемой, поскольку компонент не выполняет повторную визуализацию. Я попытался использовать функцию обратного вызова, например:

this.setState({device: selectedDeviceId}, () => {
    console.log(this.state.device)
})    

но код вообще не регистрируется, что указывает на то, что setState даже не вызывается.

class Stats extends React.Component {
  state = {
    viewType: 'day',
    dt: moment(),
    device: {}
  }
  getDevice = () => {
    const devices = this.props.devices || []
    const selectedDeviceId = this.props.selectedDeviceId

    devices.forEach((d) => {
      if (d._id === selectedDeviceId) this.setState({device: d})
    })
    if (!this.state.device._id && devices.length) {
      this.setState({device: devices[0]})
    }
    this.getUsage()
  }

  componentWillMount () {
      console.log('Enter StatsScreen.componentWillMount')
      let dt = this.state.dt
      const date = moment(dt).format('YYYY-MM-D')
      console.log(date)
      this.getDevice()
  }
}

person Lalaluye    schedule 28.12.2017    source источник
comment
Вы можете поделиться console.log. И значение !this.state.device._id && devices.length, чтобы убедиться, что выражение if оценивается как истинное.   -  person Shashith Darshana    schedule 28.12.2017
comment
Это даст больше идей, если вы также можете вставить свою функцию рендеринга.   -  person Shashith Darshana    schedule 28.12.2017
comment
почему ваш componentDidMount находится за пределами вашего класса статистики?   -  person DNM    schedule 28.12.2017
comment
Извините опечатка в вопросе. ComponentWillMount находится внутри класса Stats   -  person Lalaluye    schedule 28.12.2017
comment
console.log(d) = Object __immutable_invariants_hold:true _id:5a1654b2fc92299a7f00001c alert_disabled:false alert_duration:1 alert_interval:60 alert_volume:1... и т. д.   -  person Lalaluye    schedule 28.12.2017
comment
значение this.state.device._id равно null, а devices.length равно 3 - это потому, что я не успешно установил состояние устройства, это все еще пустой объект по умолчанию.   -  person Lalaluye    schedule 28.12.2017
comment
@Lalaluye Попробуйте установить начальное состояние в конструкторе класса.   -  person User3250    schedule 28.12.2017
comment
Установка начального состояния в конструкторе класса дает тот же результат. Устройство не определено. конструктор (реквизит) { super(реквизит) this.state = {viewType: 'day', dt: moment(), устройство: {} } }   -  person Lalaluye    schedule 28.12.2017
comment
Документация предлагает использовать componentDidMount, если вы не выполняете рендеринг на стороне сервера. Это может быть причиной? reactjs.org/docs/react-component.html#componentwillmount   -  person Carlos C    schedule 28.12.2017


Ответы (1)


Проблема в том, что вы не используете состояние React Native, вы используете созданную вами переменную, называемую состоянием. Исправьте это, написав метод жизненного цикла конструктора и поместив this.state = там для инициализации.

Кстати, избегайте делать подобные вещи в методе жизненного цикла willMount, делайте это в didMount, тогда вы не блокируете пользовательский интерфейс.

person user9147922    schedule 28.12.2017
comment
Я пробовал это без всякого конструктора удачи (реквизит) { super(props) this.state = {viewType: 'day', dt: moment(), device: {} } } - person Lalaluye; 29.12.2017
comment
настройка состояния в didMount исправила это. Благодарю вас! - person Lalaluye; 29.12.2017