I'm trying to use react-datepicker in a Formik form.
I have:
import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; class Fuate extends React.Component { state = { dueDate: new Date() } <Formik initialValues={initialValues} validationSchema={Yup.object().shape({ title: Yup.string().required("A title is required "), })} onSubmit={this.handleSubmit} render={({ errors, status, touched, setFieldValue, setFieldTouched, handleChange, handleBlur, handleSubmit, isSubmitting, dirty, values }) => { return ( <div> ... <DatePicker name={'dueDate'} value={values['dueDate']} onChange={e => setFieldValue('dueDate', e)} /> <DatePicker style={{ width: 180 }} date={values.dueDate} mode="date" format="YYYY-MM-DD" minDate={Date.now.toString()} maxDate="2050-06-01" confirmBtnText="Confirm" cancelBtnText="Cancel" showIcon={false} customStyles={{ dateInput: { marginLeft: 0, borderColor: "#fff" } }} onDateChange={date => setFieldValue("dueDate", date)} onTouch={setFieldTouched} />
For both of these options, the form renders, I can select a date on the calendar but it does not appear in the box and the state value is not updated with the selection.
There are no errors in the console, but the warning says:
Starting with v2.0.0-beta.1 date-fns doesn't accept strings as arguments. Please use
parseISO
to parse strings. See: toDate @ index.js:45
I tried making the initial state:
dueDate: new Date().toISOString(),
but it makes no difference.
I've seen lots of posts about setting this up with Antd's date picker, but can't find instructions for how to do it with react-datepicker.
How to use React-date picker with a Formik form? To use React-date picker with a Formik form, we can create a date picker component that renders the React-datepicker component. We use the useFormikContext hook to let us add form validation with Formik to the React-datepicker component.
Update to Dani Vijay's answer.
This uses useField
and useFormikContext
from Formik v2, to simplify usage of the component.
DatePicker.jsx:
import React from "react"; import { useField, useFormikContext } from "formik"; import DatePicker from "react-datepicker"; export const DatePickerField = ({ ...props }) => { const { setFieldValue } = useFormikContext(); const [field] = useField(props); return ( <DatePicker {...field} {...props} selected={(field.value && new Date(field.value)) || null} onChange={val => { setFieldValue(field.name, val); }} /> ); };
Usage (see Dani's answer for the complete form declaration):
... <DatePickerField name="date" /> ...
Code at codesandbox
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With