reactjs 如何使用react-hook形式控制器组件

brc7rcf0  于 2023-02-22  发布在  React
关注(0)|答案(1)|浏览(110)

我想使用react钩子表单(v7.43.1)验证MuiPhoneInput

const {
    register,
    handleSubmit,
    formState: { errors },
    control,
  } = useForm();

控制器组件如下所示

<Controller
              name="phone"
              control={control}
              render={({ field: { onChange, value } }) => (
                <MuiPhoneInput
                  value={value}
                  onChange={onChange}
                  defaultCountry={"il"}
                  variant={"outlined"}
                  error={!!errors.phone}
                  helperText={errors?.phone?.message}
                />
              )}
              rules={{
                required: "Phone is required",
              }}
            />

但是我无法在输入中写入任何内容。我尝试了其他文本域,但是没有任何效果。如何解决这个问题?

u2nhd7ah

u2nhd7ah1#

你已经很接近了,除了你的MuiPhoneInput正在丢失你用来得到valueonChangefield反结构的引用。有一个重要的ref需要被设置包含在field中。下面是一个Controller组件处理自定义掩码输入的官方example
下面是我的working sandbox,它演示了如何将material-ui-phone-materialreact-hook-form集成。

  • 由于您是在MUI组件上设置defaultCountry={"il"},因此还要设置解析到defaultValues内部的默认值,以便react-hook-form知道它。
  • 通过rules>validate对象内使用的isNotFilledTel()添加验证。
  • 处理参考焦点为undefined的React.StrictMode问题。
    • 应用程序. js**
import { Controller, useForm } from "react-hook-form";
import MuiPhoneInput from "material-ui-phone-number";

export default function App() {
  const {
    handleSubmit,
    formState: { errors },
    control,
  } = useForm({
    reValidateMode: "onSubmit",
    defaultValues: {
      phone: "+972",
    },
  });

  const isNotFilledTel = (v: string) => {
    return v.length < 15 ? "Phone number is required." : undefined;
  };

  return (
    <form onSubmit={handleSubmit((data) => console.log(data))}>
      <Controller
        name="phone"
        control={control}
        rules={{
          required: "Phone is required",
          validate: {
            inputTelRequired: isNotFilledTel,
          },
        }}
        render={({ field }) => {
          return (
            <MuiPhoneInput
              {...field}
              ref={(ref) => {
                if (ref && !ref.focus) ref.focus = () => {};
              }}
              defaultCountry={"il"}
              variant={"outlined"}
              error={!!errors.phone}
              helperText={<>{errors?.phone?.message}</>}
            />
          );
        }}
      />
      {errors.phone && <p>Phone is required.</p>}
      <button type="submit">Submit</button>
    </form>
  );
}

相关问题