Удалить первый элемент массива в состоянии реакции

Я знаю, как это сделать, но пытаюсь так и не знаю, почему это не сработает?

  drawCard = () => {
    const deck = this.state.cards;
    deck.shift();
    console.info(deck, 'deck'); //this is correctly logging one less everytime
    this.setState({cards: deck})
  }

карты это просто набор объектов

поэтому даже если функция вызывается и журнал консоли работает, почему он не обновляет состояние?

(console.info (state.cards.length) всегда возвращает 3)

Вы мутируете state. Попробуйте const deck = [...this.state.cards];

Prakash Sharma 03.05.2018 20:30
Поведение ключевого слова "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) для оценки ваших знаний,...
5
1
4 928
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

в ответ вы не можете просто изменить состояние, вам необходимо создать копию своего состояния перед обновлением,

Самый простой способ сделать это - просто заменить это:

 const deck = this.state.cards;

в это:

const deck = [...this.state.cards];

Я думаю, вы новичок в reactjs, вам лучше проверить подход к состоянию реакции (medium.freecodecamp.org/…) (хорошая статья об этом). в любом случае, вы не меняете значение состояния, вы должны получить копию данных, затем изменить копию и, наконец, использовать функцию setState, которая обновит ваше состояние

Tom Mendelson 03.05.2018 20:40
Ответ принят как подходящий

Не используйте методы, изменяющие состояние (например, Array#shift). Вместо этого вы можете использовать Array#slice для возврата неглубокой копии части массива:

drawCard = () => {
  this.setState({ cards: this.state.cards.slice(1) })
}

хорошо, это когда я регистрирую это в функции, но не когда я регистрирую состояние в рендере ?!

The Walrus 03.05.2018 20:40

Возможно, вам стоит поделиться полным кодом вашего компонента.

djfdev 03.05.2018 20:40

да, у меня была кобыла, извини. отсортировано сейчас: D

The Walrus 03.05.2018 20:41

Проблема возникает из-за того, что вы напрямую изменяете состояние. Хотя вы назначаете состояние «колода», помните, что в Javascript массивы и объекты являются ссылками. Итак, когда вы изменяете колоду, вы фактически пытаетесь изменить само состояние. Вы можете использовать другие методы для создания копии значений состояний и их изменения.

Вы можете найти это полезным: Реагировать - изменение состояния без использования setState: нужно ли этого избегать?

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