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

React Hook Form:form.reset可用但form.resetField失效问题排查

问题原因及解决办法

核心问题:对resetField的参数作用理解偏差

React Hook Form的resetField方法中,defaultValue参数的作用是更新该字段的注册默认值,而非直接将字段值设置为传入的内容。它的逻辑是先把字段的默认值替换成你传入的defaultValue,再将字段重置为这个新的默认值。但如果asset.attributes是对象类型,仅内部属性变化但引用未变时,resetField会因为引用比较的机制,无法感知到值的变化,导致重置不生效。

而form.reset()能生效的原因是:它会强制触发整个表单的状态更新,即使传入的对象引用未变,也会重新遍历并设置所有字段的值,因此能正确同步asset.attributes的变化。

可行的解决方式

方式1:用setValue直接更新字段值

如果只是需要同步外部变更的asset.attributes,不需要重置字段默认值,直接用setValue更直接:

useEffect(() => {
  if (asset) {
    const initialAttrs = Object.entries(asset.attributes || {}).map(
      ([key, value]) => ({
        key,
        value: value ? String(value) : '',
      }),
    );

    setAttrs(initialAttrs);
    form.setValue('attributes', asset.attributes || {});
  }
}, [asset, form]);

方式2:正确使用resetField(确保对象引用更新)

如果确实需要重置字段到新的默认值,要确保传入的defaultValue是新的对象引用(比如通过扩展运算符创建新对象),以此触发状态感知:

useEffect(() => {
  if (asset) {
    const initialAttrs = Object.entries(asset.attributes || {}).map(
      ([key, value]) => ({
        key,
        value: value ? String(value) : '',
      }),
    );

    setAttrs(initialAttrs);
    // 创建新对象确保引用变化
    const newAttributes = asset.attributes ? { ...asset.attributes } : {};
    form.resetField('attributes', { defaultValue: newAttributes });
  }
}, [asset, form]);

方式3:保留form.reset()但避免重复定义默认值

如果不想放弃form.reset()的可靠性,可以把默认值抽成单独变量,避免重复定义:

// 抽离默认值到外部
const DEFAULT_FORM_VALUES = {
  name: '',
  description: '',
  fields: '',
  persons: '',
  attributes: {},
  tags: [],
  contentAssets: [],
  files: [],
};

// 初始化表单时使用默认值
const form = useForm({ defaultValues: DEFAULT_FORM_VALUES });

useEffect(() => {
  if (asset) {
    const initialAttrs = Object.entries(asset.attributes || {}).map(
      ([key, value]) => ({
        key,
        value: value ? String(value) : '',
      }),
    );

    setAttrs(initialAttrs);
    // 合并默认值与asset数据,避免重复写默认值
    form.reset({
      ...DEFAULT_FORM_VALUES,
      name: asset.name,
      description: asset.description,
      fields: asset.fields?.[0]?.id,
      persons: asset.persons?.[0]?.id,
      attributes: asset.attributes,
      tags: asset.tags,
      contentAssets: asset.contentAssets,
    });
  }
}, [asset, form]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:05:01