javascript - Vyčistiť hodnotu MUI Select pomocou react-hook-form


Mám rozbaľovacie menu, kde si používateľ môže vybrať medzi „Položka 1“, „Položka 2“ a „Položka 3“. Je tu tiež tlačidlo „Resetovať“, ktoré používateľovi umožňuje vymazať svoj výber a urobiť nový.

Tu je môj kód :

import React from "react";
import { Button, FormControl, MenuItem, Select } from "@mui/material";
import { Controller, useForm, FormProvider } from "react-hook-form";

export default function App() {
  const methods = useForm();
  const { control, resetField } = methods;
  const dropDownItems = ["Item 1", "Item 2", "Item 3"];

  return (
    <FormProvider {...methods}>
      <form>
        <FormControl sx={{ width: "51%" }}>
          <Controller
            name="firstItem"
            control={control}
            rules={{ required: true }}
            render={({ field }) => (
              <Select {...field} id="firstItem">
                {dropDownItems.map((name) => (
                  <MenuItem key={name} value={name}>
                    {name}
                  </MenuItem>
                ))}
              </Select>
            )}
          />
        </FormControl>
      </form>
      <Button onClick={() => resetField("firstItem")}>Reset</Button>
    </FormProvider>
  );
}

Očakávam, že resetField vyprázdni výber rozbaľovacieho zoznamu po kliknutí na tlačidlo reset. A tak to aj robí, ale iba v stave formulára (a zobrazenie sa nezmení). Predpokladám, že je niečo ohľadom control, čomu úplne nerozumiem, ale popoludnie hľadania mi nepomohlo nájsť odpoveď.

Skúšal som tiež použiť setValue namiesto resetField, ale bez úspechu.

Odkaz: https://codesandbox.io/s/blue-platform-74tgg8?file=/src/App.js

Čo mi chýba? Ďakujem za pomoc :)

Úprava: V mojom prípade použitia je toto súčasťou väčšieho formulára, takže použitie reset na úplné obnovenie polí pre mňa nefunguje.

Odpoveď č. 1

Riešenie problému vymazania hodnoty MUI Select pomocou React Hook Form

bežný problém, s ktorým sa stretávajú vývojári pracujúci s komponentmi React a Material-UI (MUI) Select, najmä pri ich integrácii s React Hook Form. Problém spočíva v vymazávaní hodnôt v scenári závislého rozbaľovacieho zoznamu, konkrétne keď výber v jednom rozbaľovacom zozname by mal resetovať hodnotu iného rozbaľovacieho zoznamu a zobraziť ju ako prázdnu v používateľskom rozhraní.

Nezabudnite nastaviť predvolené hodnoty vo hooku useForm pre polia, ktoré plánujete resetovať.

 const {
    register,
    handleSubmit,
    watch,
    control,
    trigger,
    setValue,
    formState: { errors },
    resetField,
  } = useForm({ defaultValues: { installmentDay: "" } }); 
const frequency = watch("frequency");
const [installmentDay, setInstallmentDay] = useState(watch("installmentDay"));
  <Select
    name="Frequency"
    required
    value={frequency}
    {...register("frequency", {
      required: "required.",
    })}
    onChange={(e) => {
      setInstallmentDay("");
      resetField("installmentDay");
      //setValue("installmentDay", "");
      setValue("frequency", e.target.value);
      trigger("frequency");
    }}
    defaultValue={""}
  >
    {getfrequency.map((val, index) => {
      return (
        <MenuItem
          value={val.code}
          key={val.code}
        >
          {val.value}
        </MenuItem>
      );
    })}
  </Select>

  <Select
    name="installmentDay"
    required
    value={installmentDay}
    disabled={frequency ? false : true}
    {...register("installmentDay", {
      // required: true,
      required: "required",
    })}
    onChange={(e) => {
      setValue("installmentDay", e.target.value);
      trigger("installmentDay");
      setInstallmentDay(e.target.value);
    }}
  >
    {validator?.sys_dates.trim().split("").length <= 0
      ? getInstallmentDay()?.map((day, index) => {
          return <MenuItem value={index + 1}>{day}</MenuItem>;
        })
      : validator?.sys_dates?.split("/").map((day, index) => {
          return <MenuItem value={day}>{day}</MenuItem>;
        })}
  </Select>