Проблема, позволяющая снять флажок после применения функции проверки React js

У меня есть функция ограничения выбора, которая гарантирует, что общий отмеченный флажок выше минимального значения и ниже максимального значения, эти значения были взяты из JSON, из которого отображаются флажки, но моя проблема возникает, если минимум выше 1, как это делает функция -1, поэтому, если минимум был 2, остается 1 флажок. Вы можете увидеть на демо разницу между ордерами 1 и ордерами 2.

Полный код: https://codesandbox.io/embed/zo27pvx8l?fontsize=14

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

Функция

selectData(id, event) {
    let isSelected = event.currentTarget.checked;
    if (isSelected) {
      if (this.state.currentData < this.props.max) {
        this.setState({ currentData: this.state.currentData + 1 });
      } else {
        event.preventDefault();
        event.currentTarget.checked = false;
      }
    } else {
      if (this.state.currentData >= this.props.min) {
        this.setState({ currentData: this.state.currentData - 1 });
      } else {
        event.preventDefault();
        event.currentTarget.checked = true;
      }
    }
  }

Я не смог найти ошибку. Можете пошагово написать как воспроизвести?

Eduardo Junior 16.03.2019 22:51

@EduardoJunior Заказы 1 и Заказы 4 работают нормально, потому что минимум равен 1, но Заказы 2 и Заказы 3, где минимум выше 1, если вы выберете более одного варианта и попытаетесь отменить их выбор, вы получите варианты, которые вы не могу снять выделение.

Alpub 16.03.2019 22:57
Поведение ключевого слова "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
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Тогда вам не нужно ничего увеличивать или уменьшать, просто проверьте длину массива, чтобы узнать, находится ли она выше или ниже реквизитов min/max.

шаг 1: добавьте массив для отслеживания проверенных вещей

this.state = {
   .. other stuff ..
   checkedList: []
};

шаг 2: установите проверенное значение на основе того, находится ли оно в массиве

<input
  ...
  checked = {this.state.checkedList.includes(
    this.props.childk + (item.name || item.description)
  )}
  ...
/>

шаг 3: упростите обработчик onChange:

selectData(id) {
  if (
    !this.state.checkedList.includes(id) &&
    this.state.checkedList.length < this.props.max
  ) {
    this.setState({ checkedList: [...this.state.checkedList, id] });
  } else if (this.state.checkedList.includes(id)) {
    this.setState({
      checkedList: this.state.checkedList.filter(x => x !== id)
    });
  }
}

шаг 4: сделайте так, чтобы ваш обработчик onChange соответствовал

<input
  ...
  onChange = {() =>
    this.selectData(
      this.props.childk + (item.name || item.description)
    )
  }
  ...
/>

кодыпесочница

спасибо за ваш ответ, Что касается вашей функции selectdata, я не заметил никакого использования this.props.min, что смутило мое понимание того, что именно происходит в функции. Это работает, но я этого не понимаю. Вы можете это объяснить?

Alpub 17.03.2019 01:06

вам не нужно обрабатывать какую-либо логику min, пока пользователь выбирает элементы. вы можете выбрать 0 или max, но не более max. в конечном итоге вы отправите форму, а затем сможете предупредить пользователя, если он не выбрал хотя бы мин. элементов.

azium 17.03.2019 08:22

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