材质的UI自定义TextField不适用于Yup

时间:2020-04-06 14:33:54

标签: javascript reactjs material-ui textfield yup

我试图在我的RegisterForm中使用自定义的TextField和Yup,但是他没有做任何工作。 我一直都在留言:“冠军得主”。单击“提交”后,我不明白为什么,但是通过简单的输入就可以了。

enter image description here

RegisterPage.js

import React, { useRef } from "react";
import { useForm } from "react-hook-form";
import Button from "../../lib/Button";
import TextField from "../../lib/TextField";
import * as yup from "yup";

const SignupSchema = yup.object().shape({
  firstName: yup.string().required("⚠ Champ obligatoire."),
});

export default function Home() {
  const { register, handleSubmit, errors, watch } = useForm({
    validationSchema: SignupSchema,
  });

  const onSubmit = (data) => console.log(data);
  console.log(errors);

  return (
    <div style={styles.inputForm}>
      <p>Inscription</p>

      <form style={{ marginTop: "40%" }} onSubmit={handleSubmit(onSubmit)}>
        <label style={styles.label} htmlFor="firstName">
          Prénom
        </label>
        <TextField
          style={styles.input}
          name="firstName"
          placeholder="Toto"
          type="text"
          ref={register}
        />
        <br />
        {errors.firstName && (
          <p style={styles.error}>{errors.firstName.message}</p>
        )}
        <br />

        <Button
          style={{ marginTop: 10 }}
          type="submit"
          onClick={handleSubmit(onSubmit)}>
          Termine ton incription
        </Button>
      </form>
    </div>
  );
}

我的CustomTextField

CustomTextfield.js

import React from "react";
import PropTypes from "prop-types";
import TextField from "@material-ui/core/TextField";

function CustomField({ InputLabelProps = {}, ...props }) {
  return (
    <TextField
      InputLabelProps={{ shrink: true, ...InputLabelProps }}
      {...props}
    />
  );
}

CustomField.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default CustomField;

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要在inputRef上使用ref而不是TextFieldref将应用于最外面的元素,该元素将是div渲染的FormControl;这对yup集成没有任何帮助。 inputRef会将参考转发到input元素。

        <TextField
          style={styles.input}
          name="firstName"
          placeholder="Toto"
          type="text"
          inputRef={register}
        />

Edit Material UI - Custom TextField (composition)

相关文档:https://material-ui.com/api/text-field/#props