如何创建一个用于输入日期和时间的简单 formik 字段?

How to create a simple formik field for entering date and time?

我正在尝试创建一个非常简单的 formik 字段来输入日期和时间。要求是:

  1. 该字段的值应该是 JavaScript Date.
  2. 该字段应允许在输入字段中输入自由格式的文本,并在出现模糊事件时将其转换为 Date
  3. 如果输入的字符串无法转换为有效日期,该字段应显示错误。
  4. 如果重置表单,该字段应显示日期的初始值。

虽然我能够很容易地满足要求 1 和 2,但我在满足要求 3 和 4 时遇到了问题。我认为部分问题是我将输入字段的原始文本存储在内部状态。但是,我想不出别的办法。有没有更好的模式?

这是我的 CodeSandbox。请参阅标有“问题 1”和“问题 2”的部分

试试这个解决方案:

  1. 使用 Formik 中的 Field 组件来绑定您的自定义组件
<Field name="date" timezone={DefaultTz} component={DateTimeField} />
  1. 使用 Field 中的 form 属性 来显示错误
{form.errors.date ? (
  <div className="text-danger">{form.errors.date}</div>
) : null}
  1. 使用扩展运算符绑定 formik 字段和您转换日期的自定义模糊
<input
  className="form-control"
  placeholder={format}
  {...{ ...field, onBlur }}
/>

总的来说是这样

import React from "react";
import { DateUtils } from "@react-force/date-utils";

export interface DateTimeFieldProps extends React.InputHTMLAttributes<Date> {
  field: any;
  form: any;
  timezone: string;
  format?: string;
}

export const DateTimeField = ({
  field,
  form,
  timezone,
  format = "YYYY-MM-DD hh:mm A",
}: DateTimeFieldProps) => {
  const onBlur = () => {
    try {
      form.setValues({
        date: DateUtils.createDate(field.value, format, timezone),
      });
    } catch (error) {
      console.log(error);
    }
  };

  return (
    <React.Fragment>
      <input
        className="form-control"
        placeholder={format}
        {...{ ...field, onBlur }}
      />
      {form.errors.date ? (
        <div className="text-danger">{form.errors.date}</div>
      ) : null}
    </React.Fragment>
  );
};

工作版本是here