javascript - 如何使用formik实现最新6版本的mui Timepicker

标签 javascript reactjs validation material-ui formik

我正在使用 MUI React Timepicker 。 我想使用 Formik 将其与验证集成,但问题是值没有绑定(bind)到表单的初始值中。

const [initialValues, setInitialValues] = useState({
  mondayFrom: "",
  mondayTo: "",
});
const onSubmit = async (values: RegisterFormProps) => {
  console.log({values})//here not getting mondayFrom: ""
}

    <Formik initialValues={initialValues} enableReinitialize onSubmit={onSubmit}>
  {({
    values,
    errors,
    touched,
    handleSubmit,
    handleChange,
    isSubmitting,
    setFieldValue,
  }) => (
    <Form onSubmit={handleSubmit}>
      <Field name="mondayFrom">
        {(field) => (
          <TimePicker
            {...field}
            ampm={false}
            format="HH:mm"
            slotProps={{
              textField: {
                label: "Monday From",
                size: "small",
                fullWidth: true,
              },
            }}
          />
        )}
      </Field>
    </Form>
  )}
</Formik>;

最佳答案

您的代码几乎是正确的,但有两个问题。

  1. 解构字段。
  2. 有一个 open issue bug其中指出

the DateTime picker doesn't set the same type of data as in the initialValues. DateTime picker sends an object containing a property which is the date time in full string format.

添加

onChange 是为了通过重写 fieldonChange 属性来克服该错误。
此代码与您的代码非常相似,只需应用这些修复即可。

function App() {
    const [initialValues, setInitialValues] = useState({
        mondayFrom: "", mondayTo: "",
    });
    const onSubmit = async (values: RegisterFormProps) => {
        console.log({values})//here not getting mondayFrom: ""
        console.log(initialValues)
    }

    return (<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale="en">
            <div style={{margin: 20, padding: 20}}>
                <Formik initialValues={initialValues} onSubmit={onSubmit}>
                    {({
                          handleSubmit,values, errors, touched, handleChange, isSubmitting, setFieldValue,
                      }) => (<Form onSubmit={handleSubmit}>
                        <Field name="mondayFrom">
                            {({field}) => {
                               return (<TimePicker
                                ampm={false}
                                format="HH:mm"
                                slotProps={{
                                    textField: {
                                        label: "Monday From", size: "small", fullWidth: true,
                                    },
                                }}
                                   {...field}
                                onChange={(value)=> {
                                    setInitialValues({mondayTo: initialValues.mondayTo,mondayFrom: value.toString()})
                                }}
                            />)}
                            }
                        </Field>
                    </Form>)}
                </Formik>
            </div>
        </LocalizationProvider>);
}

更新:
正如 Profer 所指出的在注释中,onChange 的更好方法是

onChange={(value) => setFieldValue('mondayFrom', value.format("hh:mm"))}

关于javascript - 如何使用formik实现最新6版本的mui Timepicker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76461941/

相关文章:

javascript - 我遇到 JavaScript 值比较错误(例如 3>10 返回 true)

javascript - 如何正确地将 React 中随状态传递的 Date 对象放入 datepicker 中?

javascript - React/Express - 服务器端渲染将如何与我的动态页面一起工作

python - 初学者Python用户: trouble with error code - too many values to unpack (expected 2)

typescript - 如何在 Typescript 中轻松重用一组装饰器

javascript - DataTables重新加载自定义ajax函数

javascript新日期创建错误

javascript - 如何制作用户输入的数组

reactjs - 使用 react-chartjs-2 制作一个单杠

.net - WPF 验证文本框,绑定(bind)应该是什么样子?