Мой массив не пустой, но array.length возвращает 0 - PullRequest
0 голосов
/ 07 апреля 2020

Это действительно странная проблема, которую я пытался отладить сегодня; Когда компонент монтируется, я получаю уведомления, чтобы отобразить их как это

  componentDidMount() {
    this.setState(
      {
        notifications: this.props.notifications,
      }
    );
  }

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

  componentDidMount() {
    this.setState(
      {
        notifications: this.props.notifications,
      },
      () => {
        console.log(this.state.notifications);
        console.log(this.state.notifications.length);
      }
    );
  }

И что я получаю, это this!

first console.log ()

[]
0: {title: "Success", text: "You have successfully created a new game!", destination: {…}, type: "GameCreated"}
length: 1
__proto__: Array(0)

second console.log ()

0

Разве длина массива не должна быть 1 вместо 0? У меня есть элемент в этом массиве. Также, когда я пытаюсь получить первое значение в этом массиве, он возвращает неопределенное значение.

Спасибо, что нашли время, чтобы прочитать это и помочь!

Ответы [ 3 ]

3 голосов
/ 07 апреля 2020

Когда вы выводите объект с console.log, его состояние может изменяться, и вы не обязательно видите состояние этого объекта во время вызова console.log, а только во время его раскрытия в представлении консоли. Что не так с примитивами. Наиболее вероятный сценарий: при вызове console.log массив был пустым, длина которого равна 0. Когда вы развернете журнал Array в представлении консоли, вы увидите, что он заполнен, даже если он не был во время регистрации.

0 голосов
/ 07 апреля 2020

В вашем браузере console.log работает как асинхронная функция c.

Проверьте этот вопрос: Консоль Chrome JavaScript ленится при оценке массивов?

Чтобы избежать этого, вы можете использовать JOSN.parse( JSON.stringify(MutableData) ), как показано ниже;

componentDidMount() {
    this.setState(
      {
        notifications: this.props.notifications,
      },
      () => {
        console.log(JSON.parse(JSON.stringify(this.state.notifications)));
        console.log(this.state.notifications.length);
      }
    );
  }
0 голосов
/ 07 апреля 2020

Я провел такой же тест, и он правильно работает на моем компьютере, длина записи в нем равна 1. Возможно, в вашем коде есть что-то еще, что вызывает побочный эффект

...