J'essaie d'utiliser DatePicker dans Formik . Mais lorsque je clique sur la date de DatePicker, sa valeur de forme n'est pas modifiée. Au lieu de cela, j'ai eu cette erreur:
Uncaught TypeError: e.persist n'est pas une fonction chez Formik._this.handleChange (formik.es6.js: 5960)
Je raccourcis le code, le code est ci-dessous
const SomeComponent = () => (
<Formik
render={({
values,
handleSubmit,
handleChange,
setFieldValue
}) => {
return (
<div>
<form onSubmit={handleSubmit}>
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={handleChange}
/>
</form>
</div>
)
}}
/>
)
J'ai googlé quelques documents, https://github.com/jaredpalmer/formik/issues/187 et https://github.com/jaredpalmer/formik/issues/86
Alors j'ai essayé comme ci-dessous, mais ça ne marche pas.
...setFieldValue
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={setFieldValue}
/>
Je résous ceci comme
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={e => setFieldValue('joinedAt', e)}
/>
Pour les champs de saisie primitifs html, handleChange fonctionne comme un charme, mais pour les composants personnalisés, vous devez utiliser setFieldValue
pour modifier la valeur impérativement.
onChange={e => setFieldValue('joinedAt', e)}
Si vous faites une imbrication plus profonde, vous devriez utiliser Formik Field . Exemple:
<Formik
validationSchema={schema}
initialValues={initialValues}
onSubmit={(values, actions) => {}}
>
<Field name="colors" component={ColorsEditor} colors={colorArray}/>
</Formik>
const ColorsEditor = ({ field, colors, form, ...props }) => {
return (
<div>
<Button onClick={() => form.setFieldValue('colors', "myValue")}>
</Button>
</div>
)
}
Ainsi, le composant Field inclut déjà le formulaire, où réside le setFieldValue que vous pouvez utiliser où vous avez besoin. Il inclut également les erreurs et les champs nécessaires pour une personnalisation supplémentaire.
La réponse acceptée n'a pas fonctionné pour moi et n'affichait pas la date sélectionnée. Cela fait presque un an donc il pourrait y avoir des changements avec la mise en œuvre. Bien que cela puisse être résolu en utilisant toDateString()
comme ceci
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={e => setFieldValue('joinedAt', e.toDateString())}
/>