#reactjs #react-hooks
Вопрос:
В моем React-hooks
случае я не могу ограничить свой выбор элементов 2, приведенный ниже код в данный момент не проверяется. Хотел бы отобразить сообщение о проверке «Выбрано максимальное количество элементов». В чем может быть причина ?
https://codesandbox.io/s/kind-brown-n8ki4?file=/src/App.js:463-492
import React, { useRef, useEffect, useState } from "react";
import { Link, useHistory } from "react-router-dom";
import Multiselect from "multiselect-react-dropdown";
const options = [
{ key: "Apple", id: 1 },
{ key: "Bags", id: 2 },
{ key: "Coat", id: 3 },
{ key: "Drum", id: 4 }
];
const App = () => {
const maxOptions = 2;
const [selectedOption, setSelectedOption] = useState([]);
const handleTypeSelect = (e) => {
setSelectedOption(e);
};
const onNominate = () => {
alert("hello");
// ...
};
return (
<div className="App">
<div className="navbar-nav">
<div className="leftNavItem"></div>
</div>
<h1>Maximum 2 selections</h1>
<div className="nomineeSelectBox">
<Multiselect
onChange={handleTypeSelect}
options={selectedOption.length === maxOptions ? [] : options}
displayValue="key"
showCheckbox={true}
noOptionsMessage={() => {
return selectedOption.length === maxOptions
? "You have reached the max options value"
: "No options available";
}}
/>
</div>
<div className="nominateButton">
<input type="button" value="Next" onClick={onNominate} />
</div>
</div>
);
};
export default App;
Ответ №1:
У вас есть некоторые проблемы в коде, чтобы Multiselect
он работал правильно:
- Вам не нужно
onSelect
событиеmultiselect-react-dropdown
компонентаonChange
. selectedOption.length === maxOptions ? []
следует изменить наselectedOption.length 1 === maxOptions ? []
- Чтобы отобразить правильное сообщение для выбранных параметров «Нет», вам необходимо изменить
noOptionsMessage
наemptyRecordMsg
Итак, конечный результат должен быть:
<Multiselect
onSelect={handleTypeSelect}
onRemove={handleTypeRemove}
// onChange={handleTypeSelect}
options={selectedOption.length 1 === maxOptions ? [] : options}
displayValue="key"
showCheckbox={true}
emptyRecordMsg={"You have reached the max options value"}
/>
Кроме того, вы должны изменить handleTypeSelect
на :
const handleTypeSelect = (e) => {
const copy = [...selectedOption];
copy.push(e);
setSelectedOption(copy);
};
Кроме того, вам нужно обработать множественный выбор, когда элемент удаляется с onRemove
помощью метода:
const handleTypeRemove = (e) => {
const copy = [...selectedOption];
let index = copy.indexOf(e);
copy.splice(index, 1);
setSelectedOption(copy);
};
Комментарии:
1. Спасибо, после выбора максимального элемента я должен увидеть сообщение «»Вы достигли максимального значения параметров»», но теперь он не показывает доступных опций
2. @soccerway обновил код. Пожалуйста, расследуйте это еще раз.
3. @MajidMohammadi и soccerway будьте осторожны с выбранным вариантом, если вы зарегистрируете его, вы увидите, что он каждый раз накапливает весь выбор.
4. Можно ли включить электронную почту в список опций, теперь у нее есть только право на имя…
Ответ №2:
Вы всегда устанавливаете только один вариант. Таким образом, у вас всегда есть один выбранный вариант. Что вам нужно сделать, так это
const handleTypeSelect = (e) => {
setSelectedOption(prevArr => [...prevArr, e]); };
Сделайте это так, чтобы вы могли выбрать опцию, выбранную ранее.
Комментарии:
1. Пытался все еще выбрать более двух элементов. Для чего нужен объект уклонения ?
2. когда вы устанавливаете состояние, у вас есть доступ к предыдущему состоянию. в вашем случае вам также нужно получить предыдущее состояние