Я пытаюсь узнать, как использовать Formik и Yup для проверки поля формы ввода (текста). Я последовал стандартному подходу Джареда Палмера, и он отлично сработал прямо из коробки.
Когда дело доходит до чего-то, что немного больше зависит от компонентов, мне трудно достичь того же уровня оценки, и я просто не могу понять, в чем я ошибаюсь?
Ага, похоже, не может идентифицировать мою модель формы и не проверяет поле ввода должным образом ...
Я думаю, что я действительно испортил исходные значения или я не представляю их в той форме, которую вы ищете, но любая помощь здесь была бы потрясающей, это сводит с ума ...
У меня есть пример запущенной тестовой среды ››
https://codesandbox.io/s/building-multi-step-form-with-formik-yup-vjzpk
Модель формы (компоненты / CheckoutPage / FormModel / checkoutFormModel.js):
export default {
formId: "checkoutForm",
formField: {
nestedObj: {
firstName: {
name: "firstName",
label: "First name*",
requiredErrorMsg: "First name is required"
}
}
}
};
Начальные значения (компоненты / CheckoutPage / FormModel / initialValues.js):
import checkoutFormModel from "./checkoutFormModel";
const {
formField: {
nestedObj: { firstName }
}
} = checkoutFormModel;
export default {
nestedObj: {
[firstName.name]: ""
}
};
Да схема проверки (компоненты / CheckoutPage / FormModel / validationSchema.js):
import * as Yup from "yup";
import checkoutFormModel from "./checkoutFormModel";
const {
formField: {
nestedObj: { firstName }
}
} = checkoutFormModel;
export default [
Yup.object().shape({
nestedObj: Yup.object().shape({
[firstName.name]: Yup.string().required(`${firstName.requiredErrorMsg}`)
})
})
];
Адресная форма, которая объединяет Yup и Formik (components / CheckoutPage / Forms / AddressForm.js):
import React from "react";
import { Grid } from "@material-ui/core";
import { InputField } from "../../FormFields";
export default function AddressForm(props) {
const {
formField: {
nestedObj: { firstName }
}
} = props;
return (
<React.Fragment>
<Grid container spacing={3}>
<Grid item xs={12} sm={6}>
<InputField name={firstName.name} label={firstName.label} fullWidth />
</Grid>
</Grid>
</React.Fragment>
);
}