当前位置: 首页 > 知识库问答 >
问题:

React钩子表单输入字段匹配验证最佳实践

令狐翰
2023-03-14

在处理React钩子表单时进行输入字段匹配验证的最佳实践是什么?例如,在匹配电子邮件输入等时。

在使用React-Hook-form研究电子邮件匹配验证时,发现了一个问题,即试图通过验证方法将错误消息从“耦合元素”中分离出来。ref只接受一个用于React-hok-form寄存器的参数,而需要使用useRef访问current.value进行值匹配,如下所示:

import React, { useRef } from "react";
import ReactDOM from "react-dom";
import { useForm } from "react-hook-form";

function App() {
  const { register, handleSubmit, errors } = useForm();
  const inputEmail = useRef(null)
  const onSubmit = data => {
    console.log('onSubmit: ', JSON.stringify(data))
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label htmlFor="email">Email</label>
      <input
        name="email"
        type="email"
        ref={inputEmail}
      />
      {/* desired: show `email` error message */}
      <label htmlFor="email">Email confirmation</label>
      <input
        name="emailConfirmation"
        type="email"
        ref={register({
          validate: {
            emailEqual: value => (value === inputEmail.current.value) || 'Email confirmation error!',
          }
        })}
      />
      {errors.emailConfirmation && <p>{errors.emailConfirmation.message}</p>}
      <input type="submit" />
    </form>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

当进行输入字段匹配时,这个模式似乎是一个选项,但它不能很好地使用React-Hook-form!

例如,错误消息仅与一个输入情况耦合,并且每个独立字段都没有单独的消息,或者其中一个输入字段没有分配给它的寄存器,这意味着没有设置所需的属性...

所以,我正在寻找一个好的实践或模式来解决:

  • 用输入字段分隔错误消息
  • 测试匹配时,验证方法应该能够以符合React的方式引用双字段值,而不是通过DOM(document.querySelector等)

共有2个答案

燕凯旋
2023-03-14

为此,您可以使用Yup库,这很好:

在实例化useForm时,将validationSchema添加到配置对象中,并传递有效的Yup架构。像这样:

const Schema = yup.object().shape({
  email: yup.string().required('Required field'),
  emailConfirmation: yup
    .string()
    .oneOf([yup.ref('email')], 'Emails must match')
    .required('Required field'),
});

// How to add it to your useForm
const { register } = useForm({
  validationSchema: Schema
})

您的组件应该看起来像这样:

function App() {
  const { register, handleSubmit, errors } = useForm({
    validationSchema: Schema
  });

  const onSubmit = data => {
    console.log('onSubmit: ', JSON.stringify(data))
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label htmlFor="email">Email</label>
      <input
        name="email"
        type="email"
        ref={register}
      />
      {/* desired: show `email` error message */}
      <label htmlFor="email">Email confirmation</label>
      <input
        name="emailConfirmation"
        type="email"
        ref={register}
      />
      {errors.emailConfirmation && <p>{errors.emailConfirmation.message}</p>}
      <input type="submit" />
    </form>
  );
}
商松
2023-03-14

对于inputEmail,您不需要手动参考。相反,使用getValues方法获取整个表单的当前值。

const { register, getValues } = useForm()

然后注册这两个输入并从自定义验证调用getValues

  <input
    name="email"
    type="email"
    ref={register}
  />
  <input
    name="emailConfirmation"
    type="email"
    ref={register({
      validate: {
        emailEqual: value => (value === getValues().email) || 'Email confirmation error!',
      }
    })}
  />
 类似资料:
  • 问题内容: 我是android移动开发的新手(Android Studio本机开发- 新知识)。在这里,我想问一个有关输入验证最佳实践的问题。据我们所知,开发人员何时开发输入表单。我们需要防止用户在文本字段中输入错误的内容。所以这是我的问题 我们可以只为验证目的创建一个Java文件吗?所有输入形式,都只能转到一个验证文件(如果一个应用中有许多输入页面屏幕)。如果 是 ,如何才能得到该技术为我学习学

  • 我最近用react启动了另一个项目,因为我有一点时间来摆弄,我使用了带有挂钩的功能组件。我没有任何问题,只有一件事我不确定我是否正确使用,下面是一个例子: 如果我喜欢每件事的处理方式,我想使用loadData()是肮脏的;就像在前面的例子中,我尝试使用effect来处理如下内容: 但后来我得到了一个警告,比如“loadData应该是useEffect的依赖项”。如果我省略了useEffect的第二

  • 我在jquery中使用ajax调用将用户输入从刀片服务器发送到控制器。 我有一个输入字段 fname代表firstname,lname代表lastname 在我的jquery中,我有一个电话 field是字段的名称,val是用户在输入中输入的值。 updateProfilePage是一个ajax调用 在我的路由文件中,这调用了我的存储函数。我纠结的是如何验证用户输入的值。这是我在控制器中的存储方法

  • 问题内容: 我的联系页面形式如下, 需要为所有字段添加验证。谁能帮我在此反应形式中添加验证? 问题答案: 您应该避免使用refs,可以使用function来实现。 每次更改时,请更新已更改字段的状态。 然后,您可以轻松地检查该字段是否为空或您想要的其他内容。 您可以执行以下操作: 在此示例中,我仅对电子邮件和姓名进行了验证,但是您知道如何进行验证。其余的你可以自己做。 也许有更好的方法,但是您会明

  • 开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博、新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做严格的验证引起的,所以为了编写出安全可靠的Web程序,验证表单输入的意义重大。 我们平常编写Web应用主要有两方面的数据验证,一个是在页面端的js验证(目前在这方面有很多的插件库,比如Validati

  • 您如何验证有效的 HTML JavaScript 即使我对表单中的其他字段使用相同的方法,对空字段的验证也不起作用。

  • 问题内容: 我正在使用JavaFX和Scene Builder,并且有一个带有文本字段的表单。这些文本字段中的三个从字符串解析为双精度。 我希望它们是学校成绩,因此只能将其设置为1.0到6.0之间。不应允许用户写“ 2.34.4”之类的内容,但可以写“ 5.5”或“ 2.9”之类的内容。 验证已解析字段: 如何测试用户输入的值是否正确? 我已经在Stackoverflow和Google上进行了搜索

  • 问题内容: 问候,我有这个输入字段, 我想在单击提交按钮时调用IsEmpty函数。 我尝试了下面的代码,但是没有用。有什么建议吗? 问题答案: