SetState не очищает выбранные значения - React

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

Это то, что я делаю с дескриптором загрузки:

  handleStatusEditsUpload = () => {
    const { value, status } = this.state;

    this.setState({
      value: selected,
      status: {}
    });
  };

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

Основная проблема, с которой я столкнулся, связана со значением. Значение заполняется новым массивом, который просматривает ячейку и строку таблицы.

Вот демонстрация моего проекта: https://codesandbox.io/s/50pl0jy3xk

Почему не меняется состояние? любая помощь приветствуется, как всегда.

выбранный не определен в вашем фрагменте кода

George 11.02.2019 12:21

это постоянная сверху

Vaibhav Vishal 11.02.2019 12:25
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я только что запустил ваш код в предоставленной вами песочнице, и он выдает ошибки, когда вы нажимаете кнопку подтверждения (пытаясь распространить неитерируемый код). Как только это будет исправлено, состояние обновится корректно. Смотрите мою вилку ниже:

https://codesandbox.io/s/385y99575m

Я оставил несколько журналов консоли, чтобы вы могли видеть, как обновляется состояние компонента при срабатывании вашего onClick.

Почему вы передаете свои реквизиты методу handleStatusEditsUpload? Это не требует аргументов. Было ли это просто частью вашего процесса отладки?

Думаю, я мог неправильно понять ваш вопрос здесь. Какое значение вы ожидаете вернуть в результате обновления состояния? В соответствии с кодом вам нужен массив объектов, каждый из которых имеет три свойства. Прямо сейчас это не работает, так как ваш selected const каким-то образом обновляется. Как, черт возьми, это происходит, я понятия не имею.

tombraider 11.02.2019 12:45

Спасибо @tombraider

Tom Rudge 11.02.2019 14:01
Ответ принят как подходящий

Происходит то, что вы изменяете состояние в своем методе «handleValue».

const newValue = [...this.state.value]; // this holds reference 
newValue[rowIdx][cellIdx] = val; // so that here your state is mutated ( and const "selected" with it)

В долгосрочной перспективе вам, вероятно, следует немного изменить структуру данных, чтобы было проще объединять обновления со значением вашего состояния. Но быстрым решением было бы клонировать значение состояния перед его изменением:

handleValue = (event, val, rowIdx, cellIdx) => {
    const newValue = _.cloneDeep(this.state.value); // no reference anymore
    newValue[rowIdx][cellIdx] = val; // update the cloned value
    this.setState({
      value: newValue
    });
  };

Отличный улов. Я понятия не имел, что исходная ссылка все еще будет существовать при инициализации состояния из переменной, но это имеет смысл, если подумать.

tombraider 11.02.2019 13:09

Спасибо, ребята, имеет смысл. Быстрое исправление в этом случае не работает. клонГлубокий

Tom Rudge 11.02.2019 13:25

О, у вас есть еще одна ошибка с вашим примером кода: замените кнопки отправки onClick на onClick = {this.handleStatusEditsUpload}. Если вам нужно использовать свойства в этом методе, вам не нужно передавать их из рендеринга, но вы можете напрямую использовать this.props в методе.

Kevva 11.02.2019 13:32

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