React + material-ui + react-hook-form实现react表单控制

该博客展示了如何结合React、Material-UI库和react-hook-form来创建并控制自定义的输入和选择字段。通过`useForm`和`useImperativeHandle`等React Hooks,实现了表单的验证和提交功能。InputField和SelectField组件分别定制了输入框和下拉选择,提供错误提示和必填项验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

React + material-ui + react-hook-form实现react表单控制

CustomForm.jsx
import React from "react";
import { FormControl } from "@material-ui/core";
import { useForm } from "react-hook-form";
import { InputField, SelectField } from "./FormFields";

export default React.forwardRef((props, ref) => {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm();

  React.useImperativeHandle(ref, () => ({
    handleSubmit,
  }));

  return (
    <form ref={ref}>
      <FormControl fullWidth>
        <InputField
          error={Boolean(errors.lastName)}
          {...register("lastName", { required: true })}
          error-text={"this item is requiredsss"}
        >
          Name
        </InputField>
      </FormControl>
      <FormControl fullWidth>
        <SelectField
          error={Boolean(errors.firstName)}
          {...register("firstName", { required: true })}
          error-text={"this item is required"}
        >
          First Name
        </SelectField>
      </FormControl>
    </form>
  );
});

FormFields.jsx
import {
  InputLabel,
  FormHelperText,
  Input,
  Select,
  MenuItem,
} from "@material-ui/core";
import { useState, forwardRef } from "react";

export const InputField = forwardRef((props, ref) => {
  return (
    <div style={{ height: 66 }} ref={ref}>
      <InputLabel
        required={props.required === false ? false : true}
        error={props.error}
      >
        {props.children}
      </InputLabel>
      <Input fullWidth {...props} />
      {props.error ? (
        <FormHelperText error={props.error} id="my-helper-text">
          {props["error-text"] || "this item is required"}
        </FormHelperText>
      ) : (
        " "
      )}
    </div>
  );
});

export const SelectField = forwardRef((props, ref) => {
  const [value, setValue] = useState("");

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  const error = props.error && value === "";

  return (
    <div style={{ height: 66 }} ref={ref}>
      <InputLabel
        required={props.required === false ? false : true}
        error={error}
      >
        {props.children}
      </InputLabel>
      <Select
        {...props}
        error={error}
        fullWidth
        value={value}
        onChange={handleChange}
      >
        <MenuItem value={10}>Ten</MenuItem>
        <MenuItem value={20}>Twenty</MenuItem>
        <MenuItem value={30}>Thirty</MenuItem>
      </Select>
      {error ? (
        <FormHelperText error={error} id="my-helper-text">
          {props["error-text"] || "this item is required"}
        </FormHelperText>
      ) : (
        " "
      )}
    </div>
  );
});

这里实例性地自定义了两种表单域格式Input和Select,这里用到了第三方库react-hook-form和react的api:useImperativeHandle和fowardRef,其中useImperativeHandle用来定义向父组件暴露哪些属性和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值