推荐一款非常强大的表单校验库:React Hooks Form

news2024/11/26 0:41:51

在这里插入图片描述

React Hooks Form

react-hook-form 是一个专注于管理 React 表单状态的库。它的核心理念是利用 React Hooks 来简化表单的处理过程。与其他表单管理库相比,它的优势在于性能和简洁性。它不需要在每次输入更改时重新渲染整个表单组件,从而提高了性能。

其实最主要的原因是有很多组件库并没有提供表单校验功能,而且每个组件库的表单校验功能用法都不一致,因此我选择使用 ``react-hook-form 这样在使用不同组件库时表单的校验方式完成了统一。

下面将介绍一下这个表单校验库:

安装

npm install react-hook-form

官方快速入门教程: Get Started (react-hook-form.com)

Register

用于注册表单字段使表单能够监听到该字段的数据

import { useState } from "react";
import { SubmitHandler, useForm } from "react-hook-form";

interface FormData {
    name: string;
    age: number;
}

export default () => {
    const [defaultValues, setDefaultValues] = useState({ name: "", age: 0 })
    const { register, handleSubmit } = useForm<FormData>({ defaultValues });
    const onSubmit: SubmitHandler<FormData> = (data, event) => {
        // 阻止默认提交行为
        event?.preventDefault();

        console.log(data)
        // {name: 'yuyang', age: '21'}
    }

    return (
        <>
            <form onSubmit={handleSubmit(onSubmit)}>
                <input {...register("name")} type="text" />
                <input {...register("age")} type="text" />

                <button type="submit">提交</button>
            </form>
        </>
    )
}

约束表单数据

<form onSubmit={handleSubmit(onSubmit)}>
    <input {...register("name", { required: true, maxLength: 3 })} type="text" />
    <input {...register("age", { min: 0, max: 99 })} type="text" />

		<button type="submit">提交</button>
</form>

当然也可以使用正则

<input {...register("age", { pattern: /^(0|[1-9][0-9]?)$/ })} type="text" />

显示错误信息

const { register, handleSubmit, formState: { errors } } = useForm<FormData>({ defaultValues });
<form onSubmit={handleSubmit(onSubmit)}>
    <input
        {...register("name",
            {
                required: { value: true, message: "请输入名称" },
                maxLength: { value: 3, message: "名称不符合长度" }
            })}
        type="text"
    />
    <span>{errors.name && errors.name.message}</span>

    <input {...register("age", { pattern: { value: /^(0|[1-9][0-9]?)$/, message: "输入的年龄错误" } })} type="text" />
    <span>{errors.age && errors.age.message}</span>

    <button type="submit">提交</button>
</form>

重置表单数据

reset 它的作用是重置表单 defaultValues 初始数据,我们一般用于获取接口数据后,将数据回显给表单

const [defaultValues, setDefaultValues] = useState({ name: "", age: 0 })
const { register, handleSubmit, reset } = useForm<FormData>({ defaultValues });

示例: 1 秒钟后将数据更改

useEffect(() => {
    setTimeout(() => {
      	// 错误:如果我们直接修改它的值,实际上确实可以修改,不过数据虽然更改了但表单数据还是之前的并不会同步
  			// setDefaultValues({ name: "yuyang", age: 21 })
      
      	// 所以可以使用 reset 来重置默认数据实现回显效果
        reset({ name: "宇阳", age: 21 })
    }, 1000)
}, [])

手动触发表单验证

通过 trigger 可以实现手动触发表单的验证,通常适用于表单失去焦点时验证表单

const { register, handleSubmit, formState: { errors }, trigger } = useForm<FormData>({ defaultValues });
<input
    {...register("name", { required: { value: true, message: "请输入名称" } })}
    type="text"
    onBlur={() => { trigger('name') }}
/>
<span>{errors.name && errors.name?.message}</span>

监听表单数据变化

通过 watch 可以监听表单某一项或整个表单的数据变化

const { register, handleSubmit, watch } = useForm<FormData>({ defaultValues });
// 监听单个数据的变化
const data = watch("name");
// const data = watch("name", "宇阳"); // 默认值
// 宇阳

// 监听多个数据的变化
// const data = watch(["name", "age"]);
// ["宇阳", "21"]

// 监听表单所有数据的变化
// const data = watch();
// { name: '宇阳', age: '21' }

useEffect(() => {
    console.log(data);
}, [data])
<form onSubmit={handleSubmit(onSubmit)}>
    <input {...register("name")} type="text" />
    <input {...register("age")} type="text" />

    <button type="submit">提交</button>
</form>

自定义行为

默认情况下 react hooks form 自动帮我们对 value onChange 等操作做了处理,所以我们可以不用写他们。

但有些场合,比如说我们需要对输入的值做一些处理,那么我们可以自定义 onChange

但需要注意的是需要手动调用一下 register("age").onChange(e),否则这个表单就失去了 react hooks form 的特性

<form onSubmit={handleSubmit(onSubmit)}>
    <input {...register("name")} type="text" />
    <input {...register("age")} type="text" onChange={(e) => {
        // 在这里做一些自定义的操作
        console.log(e.target.value);

        // 但一定不要忘记 调用 onChange
        register("age").onChange(e)
    }} />

    <button type="submit">提交</button>
</form>

其他 API

这些比较有用,但过于简单,就不必展开细说了,大家可以查阅官方文档

获取表单焦点

参考: https://react-hook-form.com/docs/useform/setfocus

获取表单的值

参考: https://react-hook-form.com/docs/useform/getvalues

操作表单的值

参考: https://react-hook-form.com/docs/useform/setvalue

清除表单验证的错误

参考: https://react-hook-form.com/docs/useform/clearerrors

Controller(推荐)

它的功能与 Register 类似,都是用于注册表单的字段 并且 RegisterAPI 都可以使用。但不同的是该方式时候于第三方组件库使用,因为有些组件库可能并没有提供 valueonChange 或者属性名不一致导致使用 Register 会有些问题。

所以该方式适用于第三方组件库。如果组件库具有 valueonChange 那么使用Register也是可行的,不过最好使用 Controller 方式。下面将演示一下它的使用:

import { Input } from "@nextui-org/react";
import { useState } from "react";
import { Controller, SubmitHandler, useForm } from "react-hook-form";

interface FormData {
    name: string;
    age: number;
}

export default () => {
    const [defaultValues, setDefaultValues] = useState({ name: "", age: 0 })
    const { register, handleSubmit, control, formState: { errors }, trigger } = useForm<FormData>({ defaultValues });
    const onSubmit: SubmitHandler<FormData> = (data, event) => {
        // 阻止默认提交行为
        event?.preventDefault();

        console.log(data)
        // {name: 'yuyang', age: '21'}
    }

    return (
        <>
            <form onSubmit={handleSubmit(onSubmit)}>
                <Controller
                    name="name"
                    control={control}
                    rules={{ required: '请输入名称' }}
                    render={({ field }) => (
                        <>
                            <Input {...field} type="text" onChange={(e) => {
                                // 自定义行为
                                console.log(e.target.value);

                                // 务必调用 onChange
                                field.onChange(e)
                            }} onBlur={() => trigger('name')} />
                            <span>{errors.name && errors.name?.message}</span>
                        </>
                    )}
                />

                {/* 两种方式也可以混合使用 */}
                <input {...register("age")} type="text" />

                <button type="submit">提交</button>
            </form>
        </>
    )
}

总结:

虽然很明确组件库具有 valueonChangeRegister 也可以使用 或者 Controller 也可以直接使用原生表单。但还是有必要区分一下

Register: 用于简单的原生表单

Controller: 用于复杂的第三方组件表单

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

茶百道三天市值抹去三分之一:新茶饮脱下“皇帝的新装”

近日&#xff0c;随着港股通标的调整生效&#xff0c;茶百道获纳入的消息传出后&#xff0c;股价不升反降&#xff0c;单日跌幅之大引发热议。 9月10日至12日&#xff0c;茶百道在三个交易日内累计下跌36%&#xff0c;股价屡创上市以来新低。其中&#xff0c;9月11日单日跌幅更…

【强化学习系列】Gym库使用——创建自己的强化学习环境1:单一环境创建测试

目录 一、Gym类创建单一环境 1.gym类初始化 __init__() 2.gym类初始状态 reset() 3.gym类渲染可视化 render() 4.gym类运行核心 step() 5.gym类运行 在强化学习中实操中&#xff0c;有两个非常重要的设计模块&#xff0c;一个是模型网络和算法的设计&#xff0c;另一个则是用于…

计算机毕业设计选题推荐-学生在线投票系统-Java/Python项目实战(亮点:数据可视化分析、找回密码)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

UML-统一建模语言学习笔记20240912

UML入门 一、软件开发基础知识&#xff1a; 1.软件开发的生命周期&#xff0c;包括需求分析&#xff0c;设计&#xff0c;实现&#xff0c;测试和维护等阶段。 2.面向对象的编程&#xff08;OOP&#xff09;&#xff1a;UML 是一种用于描述面向对象系统的语言&#xff0c;需要…

这么好用的电脑桌面美化工具 你怎么能错过她?

芝麻时钟是一个功能强大的桌面时钟软件&#xff0c;它具有多种实用功能&#xff0c;包括桌面时钟、时钟屏保、任务栏时钟和桌面日历等。这个软件不仅提供了丰富的主题和美观的界面&#xff0c;更重要的是它的实用性和特色功能。(下载地址&#xff1a;https://clock.zhimasoft.c…

计算机网络 ---- OSI参考模型TCP/IP模型

目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…

源代码防泄密软件的五大特点

在数据防泄密领域&#xff0c;深信达的SDC沙盒软件以其独特的技术和创新应用&#xff0c;为源代码安全提供了强有力的保护。特别是在源代码防泄密方面&#xff0c;SDC沙盒表现出色&#xff0c;其实现方式主要包括以下几个方面&#xff1a; 1. **内核级虚拟沙盒技术**&#xff1…

QT学习参考书籍

6.2 Qt参考书籍资料 6.2.1 《Qt C编程从入门到实战》 主编:彭源 6.2.2 《Qt 5编程入门 第2版》编著:程梁 霍亚飞 6.2.3 《嵌入式Qt开发项目教程》编著:王浩 著 王浩 6.2.4 《Qt Quick核心编程》编著:安晓辉 6.2.5《零基础学Qt 4编程》 作者:吴迪著 6.2.6 《C并发编程实战(第2版…

【Python机器学习】循环神经网络(RNN)——超参数

几乎所有模型都可以根据数据和样本进行调整&#xff0c;它们都有各自的优势和相应的利弊权衡方式。寻找最优超参数集通常是一个棘手的问题&#xff0c;但是人类的直觉和经验可以为我们提供解决问题的方法。比如之前的例子&#xff1a; #设置任意输入序列的最大长度 maxlen100 …

论文笔记:基于LLM和多轮学习的漫画零样本角色识别与说话人预测

整理了ACM MM2024 Zero-Shot Character Identification and Speaker Prediction in Comics via Iterative Multimodal Fusion&#xff09;论文的阅读笔记 背景模型框架实现细节 模型数据集实验可视化消融实验 背景 最近读到一篇新文章&#xff0c;主要是做漫画中的零样本角色识…

Linux中限制服务如mysql的最大cpu使用率

1、cpu占用测试&#xff1a; DELIMITER // DROP PROCEDURE IF EXISTS intensive_calculations; CREATE PROCEDURE intensive_calculations() BEGINDECLARE v INT DEFAULT 0;DECLARE i INT DEFAULT 0;WHILE i < 1000000 DOSET v SQRT(i * i (RAND() * 10000));SET i i 1…

【动态规划】(一)动态规划理论及基础题目

动态规划理论及基础题目 理论基础斐波那契数爬楼梯使用最小花费爬楼梯不同的路径不同的路径2整数拆分不同的二叉搜索树 理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划…

告别存储烦恼,MyDiskTest全方位检测解决方案

科技改变生活&#xff0c;但质量决定科技的生命力——这句话在数字化时代尤为贴切。近年来&#xff0c;随着科技的飞速发展&#xff0c;U盘、SD卡、CF卡等移动存储设备已成为我们日常工作和生活中不可或缺的工具。它们便携、高效&#xff0c;能够快速存储和传输大量数据。然而&…

【详解】数据库E-R图——医院计算机管理系统

题目 某医院病房计算机管理中需要如下信息&#xff1a; 科室&#xff1a;科室名&#xff0c;科室地址&#xff0c;科室电话&#xff0c;医生姓名 病房&#xff1a;病房号&#xff0c;床位号&#xff0c;所属科室名 医生&#xff1a;工作证号&#xff0c;姓名&#xff0c;性别&a…

GPT撰写开题报告教程——课题确定及文献调研

撰写开题报告是一项复杂而重要的任务&#xff0c;需要涵盖从主题选择到文献综述、研究方法等多个环节。借助AI&#xff0c;如ChatGPT&#xff0c;可以显著提高这一过程的效率以及内容的质量。本文将详细探讨如何一步步利用ChatGPT撰写开题报告。 一、开题报告内容 一个清晰的…

基于R语言的统计分析基础:使用ggplot2包进行绘图

安装ggplot2包并查看官方文档 ggplot2是一个基于图形语法的R包&#xff0c;它允许用户通过声明式方式指定数据、美学映射和图形元素来灵活创建复杂且美观的可视化图表。 ggplot2包官方教学文档&#xff1a;ggplot2官方文档 在R语言中安装ggplot2有两种方法&#xff1a; 安装整…

【SQL】百题计划:SQL判断条件OR的使用。

【SQL】百题计划-20240912 Select name, population, area from World where area>3000000 or population > 25000000;

替换传统数据处理平台,TDengine 与华风数据达成合作

在全球能源转型的大背景下&#xff0c;新能源产业正迎来前所未有的发展机遇。随着国家对可再生能源的政策支持和市场需求的不断增长&#xff0c;风电、光伏和储能等新能源项目如雨后春笋般蓬勃发展。然而&#xff0c;随之而来的数据处理与管理挑战也日益凸显。面对海量的设备运…

YOLO-v8:对yolov8网络的改进教程(以GAM注意力模块为例)

本文将介绍如何在YOLOv8网络中进行模块化修改。 通过将改进的核心模块添加到项目中&#xff0c;即可直接运行各种 YOLOv8-xxx.yaml 网络配置文件&#xff0c;支持乐高式创新扩展。无论是进行网络结构的调整还是增加新的功能模块&#xff0c;用户只需一键运行&#xff0c;轻松实…

净赚百亿背后,海尔智家的机遇与隐忧

广撒网、出海忙&#xff0c;海尔智家如何熬过存量周期&#xff1f; 转载&#xff1a;科技新知 原创 作者丨田箫 编辑丨赛柯 冰箱、空调、洗衣机不好卖了&#xff0c;已成为不争的事实。 在购房热情降温、收入预期低迷的双重打击下&#xff0c;白电品牌正艰难求生。然而&#x…