使用Formik表单的React-datepicker

Mel*_*Mel 5 reactjs react-datepicker formik

我正在尝试以Formik形式使用react-datepicker。

我有:

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}
                                        />
Run Code Online (Sandbox Code Playgroud)

对于这两个选项,表单都会呈现,我可以在日历上选择一个日期,但它不会出现在框中,并且状态值不会随选择内容而更新。

控制台中没有错误,但警告显示:

从v2.0.0-beta.1开始,date-fns不接受字符串作为参数。请使用parseISO解析字符串。参见:toDate @ index.js:45

我试图使初始状态:

dueDate: new Date().toISOString(),
Run Code Online (Sandbox Code Playgroud)

但这没什么区别。

我已经看过很多关于使用Antd的日期选择器进行设置的帖子,但是找不到有关如何使用react-datepicker进行操作的说明。

Too*_*eve 48

更新Dani Vijay 的回答
这种用途useFielduseFormikContext从Formik V2,简化了组件的使用。

日期选择器.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);
      }}
    />
  );
};
Run Code Online (Sandbox Code Playgroud)

用法(请参阅 Dani 对完整表格声明的回答):

...
<DatePickerField name="date" />
...
Run Code Online (Sandbox Code Playgroud)

代码沙盒中的代码

  • 这是现在最好的答案(截至2019年底) (5认同)
  • 还有一个直接的“setValue”帮助器。`const [field,, { setValue }] = useField(props);` 然后 `onChange={val =&gt; setValue(val)}` (2认同)
  • 最初有一件事让我感到困惑 - 使用这个,你不需要添加 `onChange` 和 `value` 道具,你不需要它们,它可以在没有它们的情况下工作。 (2认同)

Dan*_*jay 11

react- datepicker可以通过setFieldValueFormik一起使用,

const DatePickerField = ({ name, value, onChange }) => {
    return (
        <DatePicker
            selected={(value && new Date(value)) || null}
            onChange={val => {
                onChange(name, val);
            }}
        />
    );
};

const App = () => (
    <Formik
        initialValues={{ date: "" }}
        ...
    >
        {props => {
            const {
                values,
                handleSubmit,
                setFieldValue
                ...
            } = props;
            return (
                <form onSubmit={handleSubmit}>
                    <DatePickerField
                        name="date"
                        value={values.date}
                        onChange={setFieldValue}
                    />
                    ...
Run Code Online (Sandbox Code Playgroud)

CodeSandbox演示在这里