Мой 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 раскрывающихся списков выбора.
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/>
экземпляров;)
Вы имеете в виду array.push с тем же ключом, если он существует?
Не нужно использовать push
— просто используйте доступ к индексированному массиву — попробуйте в консоли: var arr=[]; arr[3]=true; console.info(arr); arr[3]='whatever'; console.info(arr);
Понял .. Я успешно реализовал. Спасибо, мужик, за твое время.
Я использовал
selected
как объект, чтобы избежать.push
, который будет иметь несколько целых.