Undefined переменная React JS

это мой первый раз, когда я кодирую Javascript / React JS, поэтому я не уверен, что здесь не так. getLicensees () отправляет запрос GET в мой API и возвращает всех лицензиатов. Пока это работает, также логи консоли работают и печатают правильное значение.

constructor(props) {
super(props);

this.state = {licensees: []};

let licenseeResponse = LicensingService.getLicensees()
  .then(licensees => {
    this.state.licensees = licensees;
    console.info("component", licensees);
    console.info(licensees[0].city);
  });
}

Я пытаюсь создать таблицу из всей информации, содержащейся в моем объекте лицензиатов. Но я не могу использовать this.state.licensees[0].city внутри моего метода render ().

render() {
return (
  <main id = "content">
    <div id = "head">
      <h4 className = "headline">
        Liste aller Lizenznehmer
      </h4>

      <div className = "licenseeTable">
        <table>
          <tr>
            <th>Lizenz nehmer</th>
            <th>Aktuelles Zertifikat</th>
            <th>Details</th>
          </tr>
          <tr>
            <td>{this.state.licensees[0].city}</td>
            <td>test2</td>
            <td>test3</td>
          </tr>
        </table>
      </div>
    </div>
  </main>
);
}

как я могу это сделать правильно?

--Мое решение:

componentDidMount() {
console.info('component did mount..', this);
LicensingService.getLicensees()
  .then(licensees => {
    this.setState({licensees});
    console.info(licensees);
  });
}

...

{
            this.state.licensees.map(license => {
              return <tr>
                <td>{license.company}</td>
                <td>{license.testCertificate.toString()}</td>
                <td>{license.city}</td>
              </tr>
            })
          }

this.setState ({licensees}) - правильный способ присвоить значение объекту состояния.

* Offtopic: вы можете посмотреть официальную документацию, я думаю, что есть небольшая проблема в вашей логике установленного состояния, reactjs.org/docs/state-and-lifecycle.html, хотя состояние в React является объектом, и его можно установить непосредственно в конструкторе, это более уместно использовать метод setState вне конструктора (например, в ловушке componentDidMount) при извлечении некоторых данных (я предполагаю, что getLicensees - это некоторый асинхронный код)

Християн Христов 04.06.2018 12:34

Вы изменили свой setState на этот this.setState({licensees}); ??

supra28 04.06.2018 14:55

да :--)

Xxtreem 04.06.2018 15:29
Поведение ключевого слова "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) для оценки ваших знаний,...
2
3
1 238
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что, хотя у вас есть запрос API в конструкторе, он вернет ответ только после цикла рендеринга, и, поскольку вы напрямую изменяете состояние в разрешенном обещании, повторный рендеринг не вызывается.

Что вам нужно сделать, так это вызвать API-вызов в методе жизненного цикла componentDidMount и обновить свое состояние с помощью setState

constructor(props) {
   super(props);

   this.state = {licensees: []};

}

componentDidMount() {
    LicensingService.getLicensees()
      .then(licensees => {
        this.setState({licensees});
        console.info("component", licensees);
        console.info(licensees[0].city);
    });
}

Спасибо! Это мне помогает :)

Xxtreem 04.06.2018 13:42

Рад, что помогли :-)

Shubham Khatri 04.06.2018 13:42

но есть еще одна проблема, он говорит, что: Объекты недействительны как дочерние элементы React (найдено: объект с ключами {city, ...}. Если вы хотели отобразить коллекцию дочерних элементов, используйте вместо этого массив. Я попытался сформировать его в массив, но он говорит, что не может этого сделать, потому что его undefined Я пытался сформировать его в массив, но он говорит, что он не может этого сделать, потому что его undefined

Xxtreem 04.06.2018 13:52

Можете ли вы добавить свой массив лицензий в вопрос

Shubham Khatri 04.06.2018 13:56

Отредактируйте неправильный пост фейспалм, посмотрите его сейчас на мой исходный вопрос :)

Xxtreem 04.06.2018 14:10

Я имел в виду, чтобы вы добавили образец ответа для лицензиатов.

Shubham Khatri 04.06.2018 14:12

ты имеешь ввиду это?

Xxtreem 04.06.2018 14:21

Сначала вы хотите переместить вызов api в componentDidMount вместо того, чтобы делать это в конструкторе, это не сработает, поскольку ваш компонент уже был бы отрисован до того, как вы получите данные.

Затем вам нужно использовать setState, чтобы вызвать функцию рендеринга, чтобы отображалось обновленное значение. как это :

this.setState({licensees}); вместо прямого изменения состояния, например

this.state.licensees = licensees;

подробнее здесь Правильное использование состояния

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

<td>{this.state.licensees[0].city}</td>

сделай это

{this.state.licensees && <td>{this.state.licensees[0].city}</td>} //only render when you have the value in the state.

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