如何在Ant设计或材质UI中使用react-hook-form

时间:2019-11-13 09:05:43

标签: reactjs material-ui antd react-hook-form

我正在尝试使用react-hook-form库来验证表单。当我使用蚂蚁设计或材质UI渲染视图时,它无法正常工作。

<Input name="firstName" ref={register({ required: true })} />
  {errors.firstName && 'First name is required'}

发生了一些警告:"Missing name at....."

5 个答案:

答案 0 :(得分:13)

V4的最新建议是使用内置的Document组件(docs)。您无需安装<Controller />的额外依赖项。

来自react-hook-form-input的README.md:

此组件现在是React Hook Form V4的一部分,并使用更简单的API重命名为Controller。

示例:

react-hook-form-input

请注意,@ Bill(接受的答案的作者)现在也says指出答案已过时,请“改为使用控制器”。

答案 1 :(得分:4)

使用inputRef应该足以用于TextField组件,并且对于任何默认值,react-hook-form(useForm)可提供defaultValue,以防您要使用某些默认值或material-ui具有他们的TextField API中的defaultValue

const { register, handleSubmit, errors, watch } = useForm({ mode: 'onChange' });



<TextField
  inputRef={register({ required: true })}
  label="Email Address"
  name="email"
  type="email"
  autoComplete="email"
  onChange={handleUpdate}
  error={errors.email}
  helperText={errors.email && 'email required'}
/>

答案 2 :(得分:3)

在这里反应钩子表单作者。 React Hook Form包含不受控制的组件和本机输入,但是很难避免使用外部受控组件,例如React-Select,AntD和Material-UI。因此,我构建了一个包装器组件,以帮助您更轻松地集成。

https://github.com/react-hook-form/react-hook-form-input

好吧,您可能想知道这样做的目的是什么,从具有受控组件的React钩子形式中得到什么?首先,您仍然可以从我们选择的构建验证或架构验证中受益。其次,这可以通过将输入状态更新与其自身隔离来改善您的应用程序或表单的性能,这意味着即使使用受控制的组件,也可以通过0 re-render生成您的表单根。

这是codeandbox示例: https://codesandbox.io/s/react-hook-form-hookforminput-rzu9s

希望这些有道理,我创建的额外组件也可以为您提供帮助。

在此之上,我还构建了一个包装器组件,使事情变得简单一些:

import React from 'react';
import useForm from 'react-hook-form';
import { RHFInput } from 'react-hook-form-input';
import Select from 'react-select';

const options = [
  { value: 'chocolate', label: 'Chocolate' },
  { value: 'strawberry', label: 'Strawberry' },
  { value: 'vanilla', label: 'Vanilla' },
];

function App() {
  const { handleSubmit, register, setValue, reset } = useForm();

  return (
    <form onSubmit={handleSubmit(data => console.log(data))}>
      <RHFInput
        as={<Select options={options} />}
        rules={{ required: true }}
        name="reactSelect"
        register={register}
        setValue={setValue}
      />
      <button
        type="button"
        onClick={() => {
          reset({
            reactSelect: '',
          });
        }}
      >
        Reset Form
      </button>
      <button>submit</button>
    </form>
  );
}

https://github.com/react-hook-form/react-hook-form-input

答案 3 :(得分:2)

对于Material-UI,您可以将register通过TextField组件prop inputRef(我也使用Yup进行验证模式)

import React, { useState } from 'react';
import { Button, TextField } from '@material-ui/core';
import useForm from 'react-hook-form';
import { object, string } from 'yup';

const Form: React.FC = () => {
  const schema = object().shape({
    username: string().required('Username is required'),
    password: string().required('Password is required'),
  });
  const { register, handleSubmit, errors } = useForm({ validationSchema: schema });
  const onSubmit = (data: any) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <TextField
        name="username"
        error={!!errors.username}
        label="Username"
        helperText={errors.username ? errors.username.message : ''}
        type="email"
        inputRef={register}
        fullWidth
      />
      <TextField
        name="password"
        error={!!errors.password}
        label="Password"
        inputRef={register}
        helperText={errors.password ? errors.password.message : ''}
        type="password"
        fullWidth
      />

      <Button
        color="primary"
        type="submit"
        variant="contained"
        fullWidth
      >
        Submit
      </Button>
    </form>
  );
};

答案 4 :(得分:0)

使用其他一些人提到的TextField inputRef方法,我遇到了0个问题。

<TextField
  inputRef={register}
  id="name"
  name="name"
/>

我在此处发布了完整的工作版本:https://ragecode.dev/react-hook-form-material-ui