Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React-datepicker with a Formik form

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.

like image 463
Mel Avatar asked May 26 '19 09:05

Mel


People also ask

How do you use datepicker in Formik React?

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.


1 Answers

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

like image 118
ToolmakerSteve Avatar answered Oct 02 '22 17:10

ToolmakerSteve