Issue
I'm using Ionic 7, React 18, and Formik 2.4.5. Does Ionic work with Formik? I tried creating a very simple form with just a first and last name ...
const MyComponent: React.FC<MyComponentProps> = ({ }) => {
const validationSchema = Yup.object({
firstName: Yup.string().required('First Name is required'),
lastName: Yup.string().required('Last Name is required')
// Add other fields to validate here
})
return (
<Formik
initialValues={{
firstName: null,
lastName: null
}}
validationSchema={validationSchema}
onSubmit={(values) => {
alert(JSON.stringify(values, null, 2))
}}
>
{(formikProps) => (
<>
<strong>Sender Information</strong>
<form onSubmit={formikProps.handleSubmit}>
<IonInput placeholder='First Name' value={formikProps.values.firstName} onIonChange={formikProps.handleChange} />
{formikProps.touched.firstName && formikProps.errors.firstName ? <div>{formikProps.errors.firstName}</div> : null}
<IonInput placeholder='Last Name' value={formikProps.values.lastName} onIonChange={formikProps.handleChange} />
{formikProps.touched.lastName && formikProps.errors.lastName ? <div>{formikProps.errors.lastName}</div> : null}
<button type='submit'>Submit</button>
</form>
</>
)}
</Formik>
)
}
export default MyComponent
However clicking "Submit" always results in the error messages displaying even if I have typed text into them . When I remove the "validationSchema" property, I see my submit handler called, however, the values for the two fields are always empty even if I have entered text into them. Curious if Formik is something that is meant to work with React at all.
Solution
Yes, Formik can be used with React and Ionic to manage and validate form state. The issue you're facing as per the code is related to the way the onIonChange event is handled for the IonInput component. The event object provided by onIonChange is different from the standard React onChange event. As a result, Formik is unable to capture the changes correctly, leading to errors in displaying validation messages and submitting the form.
Now, to fix the issue, the onIonChange event handler should use Formik's setFieldValue function, which manually updates the field values when the event is triggered. Additionally, I added the name attribute to the IonInput components.
<IonInput
name='firstName'
placeholder='First Name'
value={formikProps.values.firstName}
onIonChange={(e) => formikProps.setFieldValue('firstName', e.detail.value)}
/>
{formikProps.touched.firstName && formikProps.errors.firstName ? (
<div>{formikProps.errors.firstName}</div>
) : null}
<IonInput
name='lastName'
placeholder='Last Name'
value={formikProps.values.lastName}
onIonChange={(e) => formikProps.setFieldValue('lastName', e.detail.value)}
/>
{formikProps.touched.lastName && formikProps.errors.lastName ? (
<div>{formikProps.errors.lastName}</div>
) : null}
Suggestion:
You should consider looking at React-hook-forms library as well. It is lightweight, and compatible with Ionic, React.
References:
Answered By - mandy8055
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.