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

React Final Form中form.restart触发FieldArray无效验证的解决方法

问题描述

我有一个包含FieldArray的表单,底部设有通过form.restart删除所有列表项的按钮。执行该操作时会触发每个字段的验证,但字段值为undefined,这破坏了验证逻辑。理论上此时完全不应触发验证,请问如何消除form.restart时的验证?

解决方案

方法一:改用form.reset代替form.restart

form.reset()的默认行为是将表单恢复为初始值,且不会触发验证逻辑。如果你的初始值就是空数组{ items: [] },直接调用无参的form.reset()即可实现需求。

方法二:给form.restart传入验证控制参数

如果必须使用form.restart,可以在调用时传入配置选项,明确禁止触发验证:

form.restart({ items: [] }, { keepDirty: true, shouldValidate: false })

兜底方案:在验证函数中跳过undefined值的验证

如果上述方法无法适用,也可以在字段的验证函数中增加判断,当值为undefined时直接跳过验证:

validate={(value) => {
  if (value === undefined) return;
  // 你的正常验证逻辑
}}
修改后的完整代码
import React from "react";
import { Form, Field } from "react-final-form";
import { FieldArray } from "react-final-form-arrays";
import arrayMutators from "final-form-arrays";

import "./styles.css";

export default function App() {
  const [values] = React.useState({ items: [] });

  const renderForm = ({ form }) => {
    return (
      <div>
        <FieldArray name="items">
          {({ fields }) => (
            <div>
              {fields.map((name, index) => (
                <div key={name}>
                  <Field
                    name={`${name}.title`}
                    validate={(value) => console.log(value)}
                    key={name}
                  >
                    {({ input }) => (
                      <input
                        value={input.value}
                        onChange={(event) => input.onChange(event.target.value)}
                      />
                    )}
                  </Field>
                </div>
              ))}
              <button onClick={() => fields.push({ title: "111" })}>
                add item
              </button>
              {/* 方法一:使用reset */}
              <button onClick={() => form.reset()}>reset</button>
              {/* 方法二:带参数的restart(可注释掉上面的reset按钮使用) */}
              {/* <button onClick={() => form.restart({ items: [] }, { keepDirty: true, shouldValidate: false })}>reset</button> */}
            </div>
          )}
        </FieldArray>
      </div>
    );
  };

  return (
    <div className="App">
      <Form
        onSubmit={() => {}}
        initialValues={values}
        render={renderForm}
        mutators={{ ...arrayMutators }}
      />
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:15:32