ค้นหาเว็บไซต์

javascript - ล้างค่าของ MUI Select โดยใช้ react-hook-form


ฉันมีเมนูแบบเลื่อนลงที่ผู้ใช้สามารถเลือกจาก "รายการ 1", "รายการ 2" และ "รายการ 3" นอกจากนี้ยังมีปุ่ม "รีเซ็ต" ที่ให้ผู้ใช้ลบการเลือกของตนเพื่อทำการเลือกใหม่

นี่คือโค้ดของฉัน :

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

ฉันคาดว่า resetField จะล้างการเลือกของเมนูแบบเลื่อนลงเมื่อคลิกปุ่มรีเซ็ต และมันก็ทำเช่นนั้น แต่เฉพาะในสถานะของฟอร์ม (และการแสดงผล ไม่ เปลี่ยนแปลง) ฉันสมมติว่ามีบางอย่างเกี่ยวกับ control ที่ฉันไม่เข้าใจอย่างถ่องแท้ แต่หลังจากใช้เวลาหนึ่งบ่ายในการค้นหาก็ไม่พบคำตอบ

ฉันก็ลองใช้ setValue แทน resetField แล้ว แต่ก็ไม่เป็นผล

ลิงก์: https://codesandbox.io/s/blue-platform-74tgg8?file=/src/App.js

ฉันกำลังพลาดอะไรอยู่ไหม? ขอบคุณสำหรับความช่วยเหลือ :)

แก้ไข: ในกรณีการใช้งานของฉัน นี่เป็นส่วนหนึ่งของฟอร์มที่ใหญ่กว่า ดังนั้นการใช้ reset เพื่อรีเซ็ตฟิลด์ทั้งหมดจึงใช้ไม่ได้สำหรับฉัน

คำตอบ #1

การแก้ไขปัญหาการล้างค่าของ MUI Select ด้วย React Hook Form

ปัญหาทั่วไปที่นักพัฒนาที่ทำงานกับ React และ Material-UI (MUI) Select components ประสบ โดยเฉพาะเมื่อรวมเข้ากับ React Hook Form ปัญหาที่เกิดขึ้นเกี่ยวข้องกับการล้างค่าของ dropdown ที่ขึ้นอยู่กับอีก dropdown หนึ่ง โดยเฉพาะเมื่อการเลือกใน dropdown หนึ่งควรรีเซ็ตค่าของ dropdown อื่นและแสดงให้ว่างใน UI

อย่าลืมตั้งค่ามาตรฐานใน useForm hook ของฟิลด์ที่คุณกำลังจะรีเซ็ต

 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>