Formik 表单提交时怎么获取最新值?

子硕🍀 阅读 73

我用 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’,这正常吗?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
令狐雨妍
这个问题听起来像是 Formik 的状态更新没有及时反映到 handleSubmit 中。通常情况下,Formik 应该能自动处理表单值的变化,但有时候配置不当会导致获取不到最新的值。

首先检查一下你的 Formik 版本是否是最新的,有时候 bug 会在新版本中被修复。

其次,确保你的 Field 组件正确地绑定了 name 属性,并且没有手动干预 values 的更新。你的代码看起来没问题,但是可以尝试一下手动触发 formik 的 handleChange 来看是否有变化。

再者,enableReinitialize 主要在 initialValues 变化时重新初始化表单使用,如果你只是想获取最新的输入值,这个配置可能不是必要的。

最后,确保你的表单提交按钮是在 Formik 提供的 Form 组件内部,这样才能正确触发 handleSubmit。

如果你确认以上都没有问题,可以尝试以下代码示例,增加一个简单的 onChange 处理来确认值是否在变化:

const MyForm = () => {
return (
initialValues={{ name: 'old' }}
onSubmit={(values) => console.log(values)}
>
{({ values, handleChange }) => (




)}

);
};


如果问题依然存在,可能得仔细检查一下整个组件树,看看是否有地方错误地覆盖或者修改了 formik 的状态。有时候调试起来挺让人头疼的,希望这个能帮上忙。
点赞
2026-03-21 20:34
码农乙涵
这个问题的关键是:你的代码看起来其实是对的,Field 应该是受控的,onSubmit 没理由拿不到新值。

让我先给你一个确认能work的完整示例:

import React from 'react';
import { Formik, Form, Field } from 'formik';

const MyForm = () => {
return (
initialValues={{ name: 'old' }}
onSubmit={(values, { resetForm }) => {
console.log('提交的值:', values);
// 这里应该能正确打印出新输入的值
// resetForm(); // 如果需要提交后重置
}}
>
{({ values }) => (

{/* Field 默认就是受控的,会自动和 Formik 的 state 同步 */}



{/* 调试用:实时显示当前值 */}

当前values: {JSON.stringify(values)}


)}

);
};

export default MyForm;


如果上面这个还是不行,那问题很可能出在导入上——你确认导入方式是对的吗?

// 正确姿势
import { Formik, Form, Field } from 'formik';

// 错误姿势可能导致绑定失效
// import { Formik } from 'formik'
// import Form from 'formik' // 这样 Form 就没有和 Formik 的 context 绑定


还有一个可能:检查一下你的 Formik 组件外层有没有什么 key 属性或者父组件重渲染问题,有时候父组件重新挂载 Formik 会导致状态丢失。

你实际跑一下上面那个完整示例,如果控制台打印的还是 'old',把完整代码贴出来,我帮你排查。
点赞
2026-03-18 09:12