Formik 内で DatePicker を使用しようとしています。しかし、DatePickerの日付をクリックしても、フォームの値は変更されません。代わりに、私はこのエラーを受け取りました:
不明なTypeError:e.persistはFormik._this.handleChangeの関数ではありません(formik.es6.js:5960)
私はコードを短くします、コードは以下です
const SomeComponent = () => (
<Formik
render={({
values,
handleSubmit,
handleChange,
setFieldValue
}) => {
return (
<div>
<form onSubmit={handleSubmit}>
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={handleChange}
/>
</form>
</div>
)
}}
/>
)
いくつかのドキュメントをグーグルで検索しました https://github.com/jaredpalmer/formik/issues/187 および https://github.com/jaredpalmer/formik/issues/86
だから私は以下のようにしようとしましたが、うまくいきません。
...setFieldValue
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={setFieldValue}
/>
私はこれを次のように解決します
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={e => setFieldValue('joinedAt', e)}
/>
Htmlプリミティブ入力フィールドの場合、handleChangeはチャームのように機能しますが、カスタムコンポーネントの場合は、setFieldValue
を使用して値を強制的に変更する必要があります。
onChange={e => setFieldValue('joinedAt', e)}
より深いネストがある場合は、Formik Field を使用する必要があります。例:
<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>
)
}
そのため、Fieldコンポーネントにはすでにフォームが含まれており、必要な場所で使用できるsetFieldValueが存在します。また、エラーと追加のカスタマイズに必要なフィールドも含まれます。
受け入れられた答えは私にとっては機能せず、選択された日付を表示しませんでした。ほぼ1年が経過しているため、実装に変更が加えられる可能性があります。これはtoDateString()
を使用して修正できますが、
<DatePicker
name={'joinedAt'}
value={values['joinedAt']}
onChange={e => setFieldValue('joinedAt', e.toDateString())}
/>