使用 Material UI 自动完成组件根据当前选择的选项禁用选项
Disable options based on currently selected option with Material UI Autocomplete component
我正在使用 Material UI、React Hook Form 和 Yup 创建一个自动完成元素,它允许用户为一周中的几天选择多个输入。
如果用户选择“每天”选项,我想禁止选择星期日、星期一、星期二...等。我该如何使用 getOptionDisabled 来做到这一点?
这是我当前的代码...
const daysOfWeekSuggestions = [
{label: "Every day"},
{label: "Sunday"},
{label: "Monday"},
{label: "Tuesday"},
{label: "Wednesday"},
{label: "Thursday"},
{label: "Friday"},
{label: "Saturday"}
];
<Autocomplete
disableClearable
disablePortal
filterSelectedOptions
multiple
getOptionLabel={(option) => option.label}
id="days-autocomplete"
options={daysOfWeekSuggestions}
renderInput={(params) => <TextField
required
error={errors.daysOfWeek ? true : false}
id="daysOfWeek"
label="Days of the week"
name="daysOfWeek"
type="search"
{...params}
{...register("daysOfWeek")}
/>}
/>
我认为您需要的不仅仅是 getOptionDisabled 选项。
我在我的上一个应用程序中做过类似的事情,因为你需要为每个选项添加一个名为 disabled 的 属性 和 onChange 到 Every day,手动禁用其余选项。
您可以在此处查看工作演示 - https://codesandbox.io/s/disable-mui-autocomplete-options-on-condition-gurzb
您需要做的是使用 getOptionDisabled
属性,然后检查用户是否已经选择了每天。我猜你正在将它保存到类似于我在这里使用它的状态,这样你就可以使用 .some
函数来查看 Every day 对象是否在值数组中。
const daysOfWeekSuggestions = [
{ label: "Every day" },
{ label: "Sunday" },
{ label: "Monday" },
{ label: "Tuesday" },
{ label: "Wednesday" },
{ label: "Thursday" },
{ label: "Friday" },
{ label: "Saturday" }
];
export default function DaysOfTheWeekSelect() {
const [value, setValue] = React.useState([]);
const handleOnChange = (e, value) => {
setValue(value);
};
return (
<Autocomplete
disableClearable
disablePortal
multiple
getOptionLabel={(option) => option.label}
id="days-autocomplete"
onChange={handleOnChange}
options={daysOfWeekSuggestions}
getOptionDisabled={(option) => {
if (value.some((day) => day.label === "Every day")) {
return true;
}
if (value.some((day) => day.label === option.label)) {
return true;
}
}}
value={value}
renderInput={(params) => (
<TextField
required
error={errors.daysOfWeek ? true : false}
id="daysOfWeek"
label="Days of the week"
name="daysOfWeek"
type="search"
{...params}
{...register("daysOfWeek")}
/>
)}
/>
);
}
我还规定,如果您已经选择了一个值,那么它也会被禁用。似乎比过滤掉选定的值要好一点
我正在使用 Material UI、React Hook Form 和 Yup 创建一个自动完成元素,它允许用户为一周中的几天选择多个输入。
如果用户选择“每天”选项,我想禁止选择星期日、星期一、星期二...等。我该如何使用 getOptionDisabled 来做到这一点?
这是我当前的代码...
const daysOfWeekSuggestions = [
{label: "Every day"},
{label: "Sunday"},
{label: "Monday"},
{label: "Tuesday"},
{label: "Wednesday"},
{label: "Thursday"},
{label: "Friday"},
{label: "Saturday"}
];
<Autocomplete
disableClearable
disablePortal
filterSelectedOptions
multiple
getOptionLabel={(option) => option.label}
id="days-autocomplete"
options={daysOfWeekSuggestions}
renderInput={(params) => <TextField
required
error={errors.daysOfWeek ? true : false}
id="daysOfWeek"
label="Days of the week"
name="daysOfWeek"
type="search"
{...params}
{...register("daysOfWeek")}
/>}
/>
我认为您需要的不仅仅是 getOptionDisabled 选项。 我在我的上一个应用程序中做过类似的事情,因为你需要为每个选项添加一个名为 disabled 的 属性 和 onChange 到 Every day,手动禁用其余选项。
您可以在此处查看工作演示 - https://codesandbox.io/s/disable-mui-autocomplete-options-on-condition-gurzb
您需要做的是使用 getOptionDisabled
属性,然后检查用户是否已经选择了每天。我猜你正在将它保存到类似于我在这里使用它的状态,这样你就可以使用 .some
函数来查看 Every day 对象是否在值数组中。
const daysOfWeekSuggestions = [
{ label: "Every day" },
{ label: "Sunday" },
{ label: "Monday" },
{ label: "Tuesday" },
{ label: "Wednesday" },
{ label: "Thursday" },
{ label: "Friday" },
{ label: "Saturday" }
];
export default function DaysOfTheWeekSelect() {
const [value, setValue] = React.useState([]);
const handleOnChange = (e, value) => {
setValue(value);
};
return (
<Autocomplete
disableClearable
disablePortal
multiple
getOptionLabel={(option) => option.label}
id="days-autocomplete"
onChange={handleOnChange}
options={daysOfWeekSuggestions}
getOptionDisabled={(option) => {
if (value.some((day) => day.label === "Every day")) {
return true;
}
if (value.some((day) => day.label === option.label)) {
return true;
}
}}
value={value}
renderInput={(params) => (
<TextField
required
error={errors.daysOfWeek ? true : false}
id="daysOfWeek"
label="Days of the week"
name="daysOfWeek"
type="search"
{...params}
{...register("daysOfWeek")}
/>
)}
/>
);
}
我还规定,如果您已经选择了一个值,那么它也会被禁用。似乎比过滤掉选定的值要好一点