Formik 表单提交时怎么获取最新值?
我用 Formik 写了个表单,但在 handleSubmit 里拿到的 values 好像不是最新的,明明输入框已经改了内容,但打印出来还是初始值。是不是哪里没配对?
我试过把 initialValues 改成 state,也加了 enableReinitialize,但问题还在。比如下面这样:
const MyForm = () => {
return (
<Formik
initialValues={{ name: 'old' }}
onSubmit={(values) => console.log(values)}
>
{({ values }) => (
<Form>
<Field name="name" />
<button type="submit">提交</button>
</Form>
)}
</Formik>
);
};
点提交时控制台输出的 name 还是 ‘old’,哪怕我在输入框里改成了 ‘new’,这正常吗?
首先检查一下你的 Formik 版本是否是最新的,有时候 bug 会在新版本中被修复。
其次,确保你的 Field 组件正确地绑定了 name 属性,并且没有手动干预 values 的更新。你的代码看起来没问题,但是可以尝试一下手动触发 formik 的 handleChange 来看是否有变化。
再者,enableReinitialize 主要在 initialValues 变化时重新初始化表单使用,如果你只是想获取最新的输入值,这个配置可能不是必要的。
最后,确保你的表单提交按钮是在 Formik 提供的 Form 组件内部,这样才能正确触发 handleSubmit。
如果你确认以上都没有问题,可以尝试以下代码示例,增加一个简单的 onChange 处理来确认值是否在变化:
如果问题依然存在,可能得仔细检查一下整个组件树,看看是否有地方错误地覆盖或者修改了 formik 的状态。有时候调试起来挺让人头疼的,希望这个能帮上忙。
让我先给你一个确认能work的完整示例:
如果上面这个还是不行,那问题很可能出在导入上——你确认导入方式是对的吗?
还有一个可能:检查一下你的 Formik 组件外层有没有什么 key 属性或者父组件重渲染问题,有时候父组件重新挂载 Formik 会导致状态丢失。
你实际跑一下上面那个完整示例,如果控制台打印的还是 'old',把完整代码贴出来,我帮你排查。