MUI DatePicker 无法与 Formik 一起正常工作

Dre*_*Big 7 javascript datepicker reactjs material-ui formik

我在 React 项目中使用 Formik 来处理表单并使用 MUI UI 组件。

我可以选择日期、月份,但年份部分不会改变。如果我在文本字段中手动输入年份,年份部分不会反映在更改的状态中。

这是我的代码:

                 <LocalizationProvider dateAdapter={DateAdapter}>
                   <DatePicker
                     name="birthday"
                     id="birthday"
                     variant="standard"
                     label="Birthday"
                     value={formik.values.birthday}
                     renderInput={(params) => (
                       <TextField {...params} variant="standard" fullWidth/>
                     )}
                     onChange={(value) => formik.setFieldValue('birthday', value, true)}
                     error={formik.touched.birthday && Boolean(formik.errors.birthday)}
                     helperText={formik.touched.birthday && formik.errors.birthday}
                   />
                 </LocalizationProvider>
Run Code Online (Sandbox Code Playgroud)

初始状态:

const initialFormState = {
  birthday: Date.now(),
};
Run Code Online (Sandbox Code Playgroud)

所有其他组件都正常工作,状态变化会立即显示。

Sel*_*vaS 5

onChange属性未在DatePicker组件中设置。您必须将onChange财产从TextField移至DatePicker

<LocalizationProvider dateAdapter={AdapterDateFns}>
   <DatePicker
      onChange={(value) => setFieldValue("birthday", value, true)}
      value={values.birthday}
      renderInput={(params) => (
      <TextField
        error={Boolean(touched.birthday && errors.birthday)}
        helperText={touched.birthday && errors.birthday}
        label="Birthday"
        margin="normal"
        name="birthday"
        variant="standard"
        fullWidth
        {...params}
       />
       )}
      />
  </LocalizationProvider>
Run Code Online (Sandbox Code Playgroud)

另外,name、id、variant 和 label 都是TextField的属性。

这是有效的CodeSandbox链接。


Sev*_*ell 5

对于 @mui-picker v6 我已经实现了这个解决方案

<LocalizationProvider dateAdapter={AdapterMoment}>
    <DatePicker
        disableFuture
        label="Date"
        format="DD/MM/YYYY"
        value={formik.values.date}
        onChange={(value) => formik.setFieldValue("date", value, true)}
        slotProps={{
            textField: {
                variant: "outlined",
                error: formik.touched.date && Boolean(formik.errors.date),
                helperText: formik.touched.date && formik.errors.date
            }
        }}
    />
</LocalizationProvider>
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请点击这里