【问题标题】:Disable options based on currently selected option with Material UI Autocomplete component使用 Material UI 自动完成组件根据当前选择的选项禁用选项
【发布时间】:2021-12-20 21:09:23
【问题描述】:

我正在使用 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")}
    />}
/>

【问题讨论】:

  • 您是否保存状态中组件的值?如果是的话,你也可以包括那个
  • 你用的是什么版本的材质ui?

标签: reactjs autocomplete material-ui


【解决方案1】:

您需要做的是使用getOptionDisabled 属性,然后检查用户是否已经选择了每天。我猜你正在将它保存到类似于我在这里使用它的状态,所以你可以使用 .some 函数来查看 Every day 对象是否在 values 数组中。

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")}
        />
      )}
    />
  );
}

我还指出,如果您已经选择了一个值,那么它也会被禁用。似乎比仅仅过滤掉选定的值好一点

【讨论】:

    【解决方案2】:

    我认为您需要的不仅仅是 getOptionDisabled 选项。 我在我的上一个应用程序中做了类似的事情,因为您需要为每个选项添加一个名为 disabled 的属性,并将 onChange 添加到每天,手动禁用其余选项。

    您可以在此处查看工作演示 - https://codesandbox.io/s/disable-mui-autocomplete-options-on-condition-gurzb

    【讨论】:

    • 成功了,非常感谢!
    • 再次感谢您的帮助!我已将您的解决方案实施到此组件中,并且效果很好。但是,现在我陷入了验证方面。你能看看我的其他问题/代码沙箱吗? stackoverflow.com/questions/70140006/…
    猜你喜欢
    • 2020-03-04
    • 2020-10-16
    • 1970-01-01
    • 2020-04-16
    • 2015-12-29
    • 2020-09-23
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多