Nikulio
@Nikulio
NaN !== NaN

Почему выдаёт ошибку при добавлении нового элемента в Array?

Почему-то при такой вариации кода я получаю
Table.js:21 Uncaught (in promise) TypeError: Cannot read property 'state' of undefined


createCheckboxes = () => {
    const data = this.props.pets[0];
    let state = this.state.animals;
    if (data) {
      Object.keys(data).map(function(keyName, keyIndex) {
        this.state.animals.push(data[keyName].animal);
      });
    }

    console.log(data);
  };


Но при данной вариации всё работает:
createCheckboxes = () => {
    const data = this.props.pets[0];
    let state = this.state.animals;
    if (data) {
      Object.keys(data).map(function(keyName, keyIndex) {
        state.push(data[keyName].animal);
      });
    }

    console.log(data);
  };

Почему? this.state.animals изначально такой :

state = {
    animals: []
  };


И еще вопрос - можно ли данный код как-то сократить?
Спасибо
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
state в react нельзя менять напрямую, надо использовать асинхронный метод setState.
createCheckboxes = () => {
  const data = this.props.pets[0] || {};
  const newAnimals = Object.values(data).map(el => el.animal);
 
  this.setState(({ animals }) => ({
    animals: [ ...animals, ...newAnimals ],
  }));
};


Ошибка из-за того, что вы используете к колбеке map не стрелочную функцию, а обычную и в ее контексте this в strict режиме ссылается на undefined. Со стрелочной функцией такой ошибки бы не было.

PS. Я вам советовал писать в state состояния фильтра и фильтровать массив при рендере. А вы все делаете наоборот. Неправильно используете библиотеку и функции массива. Вам надо документацию по react хорошо изучить и основы js подтянуть. Особенно возможности ES6 и экспериментальных фич используемых в react разработке.

Советую перед тем как будете отправлять работодателю свое тестовое задание, сбросить его сюда попинать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Coder321
5a571dd703441988306011.png
Юзайте стрелочную функцию, в теперешнем варианте вы теряете контекст.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы