使用 React-Hook-Form 让你的表单天生强大

简介: 使用 React-Hook-Form 让你的表单天生强大

没有人喜欢创建和重新创建带有验证的复杂表单,包括React开发人员。

React中构建表单时,必须使用一个表单库,该库提供了许多方便的工具,而且不需要太多代码。

基于实用和简单这两个标准,应用程序最理想的React表单库是 React-hook-form

让我们看看如何在你自己的项目中使用 React-hook-form 来为你的React应用程序构建丰富的、有特色的表单。

安装

让我们来讨论一个典型的用例:一个用户注册到我们的应用程序。

对于我们的注册表单,我们将为任何新用户的用户名、密码和电子邮件提供三个输入:

import React from "react";
const styles = {
  container: {
    width: "80%",
    margin: "0 auto",
  },
  input: {
    width: "100%",
  },
};
export default function Signup() {
  return (
    <div style={styles.container}>
      <h4>Sign up</h4>
      <form>
        <input placeholder="Username" style={styles.input} />
        <input placeholder="Email" style={styles.input} />
        <input placeholder="Password" style={styles.input} />
        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

一旦React项目启动并运行,我们将从安装 React-hook-form库开始:

npm i react-hook-form

使用 useForm hook

要使用 react-hook-form,我们只需要调用 useForm 钩子即可。

当我们这样做的时候,我们将得到一个对象,我们将从中解构register属性

register是一个函数,我们需要将它连接到每个输入,作为 ref

function App() {
  const { register } = useForm();
  return (
    <div style={styles.container}>
      <h4>Signup</h4>
      <form>
        <input ref={register} placeholder="Username" style={styles.input} />
        <input ref={register} placeholder="Email" style={styles.input} />
        <input ref={register} placeholder="Password" style={styles.input} />
        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

register函数将接受用户在每个输入中输入的值,以验证它。Register还将把每个值传递给一个函数,该函数将在提交表单时被调用,下面我们将讨论这个问题。

为了让register正常工作,我们需要为每个输入提供一个适当的name属性。例如,对于用户名输入,它的名称为“username”。

这样做的原因是,当我们提交表单时,我们将获得单个对象上的所有输入值。每个对象的属性都将根据我们指定的输入名称属性进行命名。代码如下:

function App() {
  const { register } = useForm();
  return (
    <div style={styles.container}>
      <h4>My Form</h4>
      <form>
        <input
          name="username"
          ref={register}
          placeholder="Username"
          style={styles.input}
        />
        <input
          name="email"
          ref={register}
          placeholder="Email"
          style={styles.input}
        />
        <input
          name="password"
          ref={register}
          placeholder="Password"
          style={styles.input}
        />
        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

使用 handleSubmit 提交表单

为了处理提交表单和接收输入数据,我们将在表单元素中添加一个onSubmit,并将其连接到同名的本地函数:

function App() {
  const { register } = useForm();
  function onSubmit() {}
  return (
    <div style={styles.container}>
      <h4>My Form</h4>
      <form onSubmit={onSubmit}>
        <input
          name="username"
          ref={register}
          placeholder="Username"
          style={styles.input}
        />
        <input
          name="email"
          ref={register}
          placeholder="Email"
          style={styles.input}
        />
        <input
          name="password"
          ref={register}
          placeholder="Password"
          style={styles.input}
        />
        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

useForm中,我们将获取一个名为handlessubmit的函数,并将其作为一个高阶函数包装在onSubmit周围。

handlessubmit函数将负责收集输入到每个输入中的所有数据,我们将在onSubmit中接收到一个名为data的对象。

现在,如果我们使用 console.log(data),我们就可以看到我们在同一个属性的每个输入中输入了什么:

function App() {
  const { register, handleSubmit } = useForm();
  function onSubmit(data) {
    console.log(data); 
    // { username: 'test', email: 'test', password: 'test' }
  }
  return (
    <div style={styles.container}>
      <h4>Signup</h4>
      <form onSubmit={handleSubmit(onSubmit)}>
        <input
          name="username"
          ref={register}
          placeholder="Username"
          style={styles.input}
        />
        <input
          name="email"
          ref={register}
          placeholder="Email"
          style={styles.input}
        />
        <input
          name="password"
          ref={register}
          placeholder="Password"
          style={styles.input}
        />
        <button type="submit">Submit</button>
      </form>
    </div>
  );
}

表单验证

验证表单并为每个输入值添加约束非常简单——我们只需要将信息传递给register函数

register接受一个对象,该对象包含许多属性,这些属性告诉register如何验证给定的输入。

第一个属性是必需的。默认情况下,它被设置为false,但我们可以将其设置为true,以确保没有填写表单时不提交

我们希望用户名值是必需的,并且希望用户的用户名大于6个字符但小于24个字符。

为了应用这个验证,我们可以将minLength的约束设置为6,但是maxLength应该是20:

<input
  name="username"
  ref={register({
    required: true,
    minLength: 6,
    maxLength: 20,
  })}
  style={styles.input}
  placeholder="Username"
/>

如果我们为这个输入使用数字(假设这个输入是关于人的年龄的),我们将使用属性min和max而不是minLength和maxLength。

正则表达式

接下来,如果愿意,我们可以提供一个 regex 正则表达式 模式。

如果我们希望用户名只包含大写和小写字符,我们可以使用下面的正则表达式,它允许自定义验证:

<input
  name="username"
  ref={register({
    required: true,
    minLength: 6,
    maxLength: 20,
    pattern: /^[A-Za-z]+$/i,
  })}
  style={styles.input}
  placeholder="Username"
/>

validate

最后是validate,这是一个自定义函数,它允许我们访问输入的值。validate允许我们提供自己的逻辑来确定它是否有效(通过返回布尔值true或false)

对于这里的电子邮件,我们也希望它是必需的,并且是有效的电子邮件。为了验证这一点,我们可以将输入传递给来自名为 isEmail的库 验证器的函数。

如果输入的是电子邮件,则返回true。否则,错误的:

<input
  name="email"
  ref={register({
    required: true,
    validate: (input) => isEmail(input), // returns true if valid
  })}
  style={styles.input}
  placeholder="Email"
/>

对于password的register函数,我们将required设置为true, minlength设置为6,不设置maxLength:

<input
  name="password"
  ref={register({
    required: true,
    minLength: 6
  })}
  style={styles.input}
  placeholder="Password"
/>

错误提示

现在,如果表单中的输入无效,我们不会告诉用户有任何错误。我们需要给他们反馈来修复他们提供的值。

当其中一个输入无效时,表单数据不会被提交(不会调用onSubmit)。此外,带有错误的第一个输入将自动聚焦,它不会向用户提供关于所发生事情的任何详细反馈。

我们可以从 useForm 中获取一个 errors对象,而不仅仅是不提交表单。

就像我们在 onSubmit 中获得的数据函数一样,errors 包含对应于每个输入名称的属性,如果它有错误的话。

对于我们的示例,我们可以为每个输入添加一个条件,并说如果有错误,我们将把borderColor 设置为红色。

function App() {
  const { register, handleSubmit, errors } = useForm();
  function onSubmit(data) {
    console.log(data);
  }
  return (
    <div style={styles.container}>
      <h4>My Form</h4>
      <form onSubmit={handleSubmit(onSubmit)}>
        <input
          name="username"
          ref={register({
            required: true,
            minLength: 6,
            maxLength: 20,
            pattern: /^[A-Za-z]+$/i,
          })}
          style={{ ...styles.input, borderColor: errors.username && "red" }}
          placeholder="Username"
        />
        <input
          name="email"
          ref={register({
            required: true,
            validate: (input) => isEmail(input),
          })}
          style={{ ...styles.input, borderColor: errors.email && "red" }}
          placeholder="Email"
        />
        <input
          name="password"
          ref={register({
            required: true,
            minLength: 6,
          })}
          style={{ ...styles.input, borderColor: errors.password && "red" }}
          placeholder="Password"
        />
        <button type="submit" disabled={formState.isSubmitting}>
          Submit
        </button>
      </form>
    </div>
  );
}

验证模式

您会注意到,默认情况下,errors对象 只有在提交表单时才会更新。默认的验证只在提交表单时执行。

我们可以通过给useForm传递一个对象来改变这一点,我们可以在需要执行验证时设置模式:onBlur、onChange或onSubmit

每当用户’失去焦点’或点击远离输入,onBlur将使验证运行。onChange是用户输入时验证,onSubmit是表单提交时验证。

对于我们的表单,让我们选择 onBlur :

const { register, handleSubmit, errors } = useForm({
  mode: "onBlur",
});

请注意,还有其他方法可以手动设置和清除错误(setErrorclearError)。例如,在某些情况下,您希望它在onSubmit中创建一个不同的错误或清除一个错误,就可以使用这些方法。

如何禁用表单的formState

我们可以从useForm钩子中得到的最后一个值是formState

它为我们提供了重要的信息,比如何时输入了某些内容,以及何时提交了表单。

因此,如果你想禁用表单的按钮,以确保表单没有提交过多次,我们可以将禁用设置为formstate.issubmitted

提交表单时,它会被禁用直到验证完成运行onSubmit函数

总结

我希望本文向您展示了如何在React应用程序中更容易地创建功能性表单。

还有很多与react-hook形式相关的特性我没有在这里介绍。点击这里,官方文档应该涵盖你能想到的任何用例



相关文章
|
21天前
|
移动开发 前端开发 JavaScript
React 表单与事件
10月更文挑战第10天
29 1
|
21天前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
87 57
|
4天前
|
前端开发 JavaScript
React 表单处理技巧
【10月更文挑战第24天】本文从初学者角度出发,详细介绍了 React 中表单处理的基本概念、常见问题及解决方案。涵盖受控组件与非受控组件的区别、状态更新、表单验证、多字段管理及高级技巧,通过代码示例帮助读者更好地理解和应用。
21 7
|
30天前
|
移动开发 JSON 数据可视化
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
43 0
|
2月前
|
人工智能 前端开发 JavaScript
react js 处理表单( form )的2个例子
react js 处理表单( form )的2个例子
|
3月前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
51 0
|
3月前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
43 0
|
3月前
|
前端开发 JavaScript 数据管理
React Formik入门:简化表单处理的神器——全面掌握Formik在React表单开发中的高效应用与实战技巧
【8月更文挑战第31天】在React应用中,表单处理常常因繁琐而令人头疼。Formik作为一个开源库,专为简化React表单设计,减少冗余代码并提升处理效率。本文介绍Formik的使用方法及其优势,通过示例展示如何安装配置并创建基本表单,帮助开发者轻松应对各种表单需求。
41 0
|
4月前
|
JavaScript 前端开发
react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label
react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label
144 1
|
6月前
|
监控 前端开发 搜索推荐
react 表单受控的现代实现方案
`react-form-simple`是一个轻量级的React表单库,专注于简化受控表单的开发,提供数据绑定、验证、错误处理和UI更新等功能。它通过简洁的API减少复杂性,支持第三方UI库集成,并具备高度可扩展性。核心特点包括基于Proxy的数据绑定、实时错误处理、高效的UI更新和灵活的使用方式。通过`useForm`和`render`等钩子,开发者可以快速构建表单应用,同时支持动态表单和自定义验证规则。该库旨在提高开发效率,适用于复杂表单场景,降低学习和维护成本。
216 2
react 表单受控的现代实现方案