如何使用 react-hook-form 条件性地禁用提交按钮?

31

找不到解决方案。
我正在使用 react-hook-form 并且想要在表单为空时禁用提交按钮,在所有表单至少填写了一些内容后启用该按钮。
如何使用 react-hook-form 实现这一点?

4个回答

51
const { 
    register, 
    handleSubmit, 
    formState: { isSubmitting, isDirty, isValid } // here
  } = useForm({ mode: "onChange" })


<button
  type="submit"
  disabled={!isDirty || !isValid} // here
>
  Comment
</button>

2
如果在嵌套组件中使用,您可以直接从 const { isDirty, isValid } = useFormState(); 获取表单状态。 - Titenis

28

到目前为止,我发现使用formState并将模式设置为onChange是最好的解决方案。

 const { register, handleSubmit, formState } = useForm({
    mode: "onChange"
  });

点击提交按钮:

<button disabled={!formState.isValid}/>

基于这个问题:https://github.com/react-hook-form/react-hook-form/issues/77

文档中关于onChange模式的解释:

每次输入时,验证将在更改事件上触发并导致多次重新渲染。警告:这经常对性能有重大影响。


3

如果我想在成功提交后再次禁用提交按钮怎么办?我在文档中没有看到这种情况的提及。感谢react-hook-form,它是一个很棒的库。 - vanduc1102
使用第三方库时,似乎无法与控制器配合使用。 - undefined

0

接近了,但我认为逻辑与其他评论略有不同。关键是使用 && 运算符。感谢使用 Formik 库的 示例

const { formState: { errors, isDirty, isValid } } = useForm()
///...
<button type="submit" disabled={!isDirty && !isValid}>
Continue
</button>

1
所以,当表单是脏的,但无效(false && true)时,它将不再被禁用吗?我认为这对于大多数用例来说都不是一个合适的答案。 - Almog Cohen
1
我认为应该是|| - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接