Formik Field自定义onChange函数未被识别且返回undefined的问题求助
嘿,我来帮你搞定这个Formik的问题!你现在遇到的核心问题是错误地直接调用了handleChange(values.password),而不是给onChange传递一个事件处理函数。
当组件渲染的时候,handleChange(values.password)会立刻执行,而如果你的handleChange没有返回一个新的函数,它就会返回undefined——这也就是Formik识别不了这个回调的原因。
接下来给你两种可行的解决方案,你可以根据自己的需求选择:
方案1:把handleChange改成返回事件处理函数的高阶函数
如果你的handleChange需要处理输入值并更新自定义状态,可以把它改成高阶函数的形式,让它返回一个真正的事件处理函数:
// 改写你的handleChange函数 const handleChange = () => (event) => { // 获取输入框的最新值 const newPassword = event.target.value; // 执行你的自定义状态更新逻辑(比如更新你自己的state) setYourCustomState(newPassword); // 如果你还需要同步更新Formik内部的values状态,记得从Formik的render props里解构出它的handleChange // 比如在Formik的回调里写成:{({ ..., handleChange: formikHandleChange }) => (...)} formikHandleChange(event); };
然后在Field里这样使用:
<Field name='password' required component={TextField} placeholder={t('authentication:password')} type='password' onChange={handleChange()} />
方案2:直接在onChange里用箭头函数,同时处理Formik和自定义逻辑
如果你不想改写现有的handleChange,可以直接在onChange属性里传入一个箭头函数,先调用Formik内置的handleChange来同步它的内部状态,再执行你的自定义逻辑:
首先要从Formik的render props里解构出它的handleChange(注意重命名避免和你的自定义函数冲突):
<Formik initialValues={initialValues} validationSchema={SetPasswordSchema} onSubmit={onSubmit} > {({ status, isSubmitting, isValid, values, handleChange: formikHandleChange }) => ( <Field name='password' required component={TextField} placeholder={t('authentication:password')} type='password' onChange={(event) => { // 先调用Formik的handleChange,确保它内部的values状态更新 formikHandleChange(event); // 再调用你的自定义处理函数,传入最新的密码值 handleChange(event.target.value); }} /> )} </Formik>
额外提醒
- 别给Field手动传递
value={values.password}!Formik的Field会自动根据name属性从内部的values里获取对应的值,手动传递反而可能导致状态不一致。 - 确保你的
handleChange逻辑正确——如果它不需要返回值也没关系,只要在箭头函数里正确传入参数调用就行。
内容的提问来源于stack exchange,提问作者Ben Shekhtman
相关产品推荐
相关产品推荐

