Я могу упустить некоторую сложность, не указанную здесь, но это выглядит так же просто, как создание универсального функционального компонента, который принимает еще пару переданных свойств.Я сделал diff, и вам нужно будет только добавить «title», «buttonText» и, если хотите, «type» к вашим реквизитам, наверняка.Вы также можете отправить объект initialValues в качестве реквизита вместо того, чтобы выводить его из 'type'.
Я имею в виду, вы пробовали следующее?
import React from 'react';
import { Link } from 'react-router-dom';
import { Helmet } from 'react-helmet';
import { Formik, FastField, Form, ErrorMessage } from 'formik';
import PropTypes from 'prop-types';
import { FormDebug } from 'utils/FormDebug';
import * as schema from 'validations/AuthValidationSchema';
function AuthPage({ buttonText, initialValues, title, type, username,
onChangeUsername, onSubmitForm }) {
const authSchema = type === 'login'
? schema.LoginValidationSchema
: schema.ForgotPasswordValidationSchema;
return (
<div>
<Helmet>
<title>{title}</title>
</Helmet>
<Formik
initialValues={initialValues}
validationSchema={authSchema}
onSubmit={onSubmitForm}
render={({ isSubmitting, isValid, handleChange }) => (
<Form>
<FastField
type="text"
name="username"
render={({ field }) => (
<input
{...field}
onChange={e => {
handleChange(e);
onChangeUsername(e);
}}
/>
)}
/>
<ErrorMessage name="username" component="div" aria-live="polite" />
{type === 'forgot' &&
<FastField type="password" name="password" />
<ErrorMessage name="password" component="div" aria-live="polite" />
}
<button type="submit" disabled={isSubmitting || !isValid}>
{buttonText}
</button>
<FormDebug />
</Form>
)}
/>
<Link to="/auth/forgot_password">Forgot Password</Link>
</div>
);
}
AuthPage.propTypes = {
buttonText: PropTypes.string,
initialValues: PropTypes.object,
title: PropTypes.string,
type: PropTypes.oneOf(['login', 'forgot'])
username: PropTypes.string,
onSubmitForm: PropTypes.func.isRequired,
onChangeUsername: PropTypes.func.isRequired,
};
export default AuthPage;
(Единственное, что я не могу вспомнить, так это: нужно ли оборачивать условное отображение поля пароля и его ErrorMessage в divили не делать их одним элементом)
Если вы не хотите передавать начальные значения:
const initialVals = type === 'login'
? { username, password: ''}
: { username }
...
initialValues={initialVals}
и удалить его из propTypes
Только другое, что яЯ не уверен, почему FormDebug размещается по-разному в двух версиях.Я оставил это после кнопки.