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

react-hook-form多页表单结合数组的校验问题

react-hook-form多页表单结合数组的校验问题

嘿,我太懂你这个头疼的问题了——多页表单来回切换的时候,react-hook-form总提前校验还没碰过的页面,本来想自由切换结果被卡死,真的烦!

咱们核心要解决的就是:只校验用户当前所在页面的字段,未访问的页面字段暂时不做校验,具体可以这么搞:

1. 放弃自动全局校验,手动控制校验时机

别直接用handleSubmit绑定Next按钮了,咱们自己写点击事件,根据当前页面触发对应字段的校验:

const handleNext = async () => {
  let isValid = true;
  // 只校验当前页面的字段
  if (currentPage === 1) {
    // 校验第一页的name字段
    isValid = await trigger('name');
  } else if (currentPage === 2) {
    // 先检查字段数组有没有至少一个元素
    const items = watch('items');
    if (items.length === 0) {
      setError('items', { message: '至少得添加一个项目哦' });
      isValid = false;
    } else {
      // 校验数组里的每个输入框
      isValid = await trigger('items.*.value');
    }
  }

  // 校验通过再切页面
  if (isValid) {
    setCurrentPage(prev => prev + 1);
  }
};

2. 给必填规则加页面判断(可选但更稳妥)

为了避免不小心触发全局校验时出错,咱们可以给字段的required规则加个页面判断,只有在当前页是对应页面时,才要求必填:

// 第一页的name输入框
<input
  {...register('name', {
    required: currentPage === 1 ? '请输入名称' : false,
  })}
  placeholder="Enter name"
/>

// 第二页数组里的输入框
{watch('items').map((_, index) => (
  <input
    key={index}
    {...register(`items.${index}.value`, {
      required: currentPage === 2 ? '请输入项目内容' : false,
    })}
    placeholder="Enter item"
  />
))}

3. 切回上一页时清除错误(提升体验)

从第二页回到第一页时,把第二页的错误提示清掉,不然留在页面上会很奇怪:

const handleBack = () => {
  setCurrentPage(prev => prev - 1);
  // 清除当前页面外的错误,或者直接清所有错误
  clearErrors('items');
};

这样调整之后,你就可以在第一页和第二页自由切换了——只有当你在第二页点击Next时,才会校验字段数组的规则,完全符合你的需求~

备注:内容来源于stack exchange,提问作者SeanWM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 07:34:35