You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Formik组件外部获取Formik values值?

在Formik组件外部获取表单values的解决方案

问题原因

你遇到的错误是因为在JSX渲染区域直接写了{(checkData = values)}——这行代码会把赋值结果(也就是整个values对象)当成React子元素去渲染,但React不支持直接渲染对象,所以抛出了报错。而且这种赋值方式的作用域只在当前map循环里,根本没法在Formik外部拿到values。

正确实现方案

要在Formik外部获取表单值,推荐两种常用方法:

方法1:使用useFormik Hook(函数组件推荐)

直接用useFormik创建表单实例,整个组件内都能直接访问values:

import { useFormik } from 'formik';

function YourForm() {
  // 初始化表单实例
  const formik = useFormik({
    initialValues: {
      correctAnswers: [{ correctAnswer: '' }]
    },
    onSubmit: (values) => {
      console.log('提交的表单值:', values);
    }
  });

  // 这里是Formik"外部"(组件内任意位置),直接访问formik.values即可
  console.log('实时表单值:', formik.values);

  return (
    <form onSubmit={formik.handleSubmit}>
      {formik.values.correctAnswers.map((answer, index) => (
        <div className="test-field" key={index}>
          <input
            className="test-field-input"
            type="text"
            name={`correctAnswers.${index}.correctAnswer`}
            value={formik.values.correctAnswers[index].correctAnswer}
            onChange={formik.handleChange}
          />
        </div>
      ))}
      <button type="submit">提交</button>
    </form>
  );
}

方法2:通过onChange同步到组件状态(Formik组件包裹场景)

如果用的是Formik组件包裹写法,可通过组件状态同步表单值:

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

function YourForm() {
  // 声明状态存储表单值
  const [formValues, setFormValues] = useState({
    correctAnswers: [{ correctAnswer: '' }]
  });

  return (
    <>
      {/* 这里是Formik外部,直接使用formValues */}
      <div>当前表单值:{JSON.stringify(formValues)}</div>
      
      <Formik
        initialValues={formValues}
        onSubmit={(values) => {
          console.log('提交的表单值:', values);
        }}
        onChange={(values) => {
          // 每次表单值变化时同步到组件状态
          setFormValues(values);
        }}
      >
        {({ values }) => (
          <Form>
            {values.correctAnswers.map((answer, index) => (
              <div className="test-field" key={index}>
                <Field
                  className="test-field-input"
                  type="text"
                  name={`correctAnswers.${index}.correctAnswer`}
                />
              </div>
            ))}
            <button type="submit">提交</button>
          </Form>
        )}
      </Formik>
    </>
  );
}

先修复当前错误

你现有代码里的{(checkData = values)}这行完全是错误写法,直接删掉就能解决渲染报错。

内容的提问来源于stack exchange,提问作者Dante1021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:45:37