Пользовательский интерфейс материала TextField не работает с Yup - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь использовать свой пользовательский TextField в моей RegisterForm с Yup, но он не работает. У меня все время появляется сообщение "Champ Champatiire". после нажатия на кнопку «Отправить» я не понимаю почему, но это хорошо с простым вводом.

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 Ответ

1 голос
/ 06 апреля 2020

Вам нужно использовать inputRef вместо ref на TextField. ref будет применен к самому внешнему элементу, который будет 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

...