Выпадающий список множественного выбора с уникальным выбором - React JS

  1. У меня есть 4 выпадающих списка.
  2. Выбранные значения не должны отображаться в остальной части раскрывающегося списка.

Мой state выглядит так

this.state = {
    selectedDropdownArray: {},
    dropdownArray: ['select','1','2','3','4','5']
}

ниже мой компонент раскрывающегося списка выбора

<SelectDropdown
    options = {this.state.dropdownArray}
    value = {this.getValue()}
    onChange = {this.handleChangeEvent.bind(this)}                                         

В функции handleChangeEvent я просто передаю значение объекту, необходимому для остальной части работы, а затем изменяю dropdownArray . Список массивов раскрывающегося списка должен фильтроваться на основе выбора.

Ниже приведена моя функция handleChangeEvent, в которой фильтруются выпадающие значения.

handleChangeEvent(name, value){
    switch(name){
        case '1' :
            this.state.selectedDropdownArray["0"] = value === "select" ? null : value
        break;
        case '2' :
            this.state.selectedDropdownArray["1"] = value === "select" ? null : value
        break;
        case '3'
        ...
        ...
    }

    let filter = Object.values(this.state.selectedDropdownArray);
    let difference = this.state.dropdownArray.filter(x => !filter.includes(x));

}

Если выбран 1-й раскрывающийся список со значением 1, difference теперь имеет отфильтрованный массив [2,3,4,5], который я могу setState преобразовать в dropdownArray.

Но 1-й выпадающий список не имеет 1 для отображения в этом выборе, так как массив уже отфильтрован.

Каков правильный подход к решению этой проблемы, чтобы иметь уникальный выбор для каждых 4 раскрывающихся списков выбора.

Поведение ключевого слова "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
0
2 918
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

1-й: определить выбранный как массив:

this.state = {
  selectedDropdownArray: [],
  dropdownArray: ['select','1','2','3','4','5']
}

Если это не требуется по другим причинам - не нужно будет использовать Object.values() в дальнейшем при фильтрации.

2-й: избегайте привязки в рендеринге, лучше привязать this.handleChangeEvent в конструкторе или использовать синтаксис стрелки - прочитайте реагирующие документы об обработке событий, передаче параметров...

3-й: вы можете использовать фильтрацию параметров для каждого экземпляра отдельно, например:

<SelectDropdown
  options = {this.state.dropdownArray.filter(x => !this.state.selectedDropdownArray.includes(x) || x===this.state.selectedDropdownArray[0])}
  value = {this.state.selectedDropdownArray[0] || ''}
  onChange = {this.handleChangeEvent}
/>

Конечно, используйте следующие индексы для следующих <SelectDropdown/> экземпляров;)

Я использовал selected как объект, чтобы избежать .push, который будет иметь несколько целых.

Matarishvan 08.04.2019 12:44

Вы имеете в виду array.push с тем же ключом, если он существует?

Matarishvan 08.04.2019 12:51

Не нужно использовать push — просто используйте доступ к индексированному массиву — попробуйте в консоли: var arr=[]; arr[3]=true; console.info(arr); arr[3]='whatever'; console.info(arr);

xadm 08.04.2019 12:54

Понял .. Я успешно реализовал. Спасибо, мужик, за твое время.

Matarishvan 12.04.2019 07:31

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