当前位置: 首页 > news >正文

React-hook-form-mui(三):表单验证

前言

在上一篇文章中,我们介绍了react-hook-form-mui的基础用法。本文将着重讲解表单验证功能。
react-hook-form-mui提供了丰富的表单验证功能,可以通过validation属性来设置表单验证规则。本文将详细介绍validation的三种实现方法,以及如何与提交按钮联动。

Demo

以下是一个表单验证的 demo,我们将通过三种方法来实现表单验证:

import React from "react";
import { useForm } from "react-hook-form";
import { Button } from "@mui/material";
import { FormContainer, TextFieldElement } from "react-hook-form-mui";const URL_REGEXP =\/^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+(?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.,?+=&%@\-/]*)?$\/;export interface UserSettings {firstName: string;lastName: string;url: string;
}/*** @descpition: lastName长度验证* @param _value 当前表单元素的值*/
const validateLastNameLength = (_value: string) => {return _value.length < 2 ? "Url is invalid!" as any : Promise.resolve();
};const MyForm = () => {const formContext = useForm<UserSettings>({defaultValues: {firstName: "",lastName: "",url: ""},mode: "all" // 验证模式切换为all});const onSubmit = (data: UserSettings) => {console.log(data);};return (<FormContainerformContext={formContext}onSuccess={(data) => {onSubmit(data);}}>{/* 使用 validation 属性设置表单验证规则 */}<TextFieldElementname="firstName"label="First Name"validation={{required: "First Name is required!"}}/><TextFieldElementname="lastName"label="First Name"validation={{validate: validateLastNameLength}}/><TextFieldElementname="url"label="Url"/><Buttontype="submit"<Buttontype="submit"// 当表单所有元素都验证通过并且表单元素发生过改变后,可以点击提交按钮disabled={!formContext.formState.isValid || !formContext.formState.isDirty}>Submit</Button></FormContainer>);
};export default MyForm;

验证触发模式 mode

首先,我们需要在formContext中规定mode属性,这个属性用来确定form何时触发验证规则。mode提供了以下5中触发方式:

ValidationMode = {onBlur: "onBlur";onChange: "onChange";onSubmit: "onSubmit";onTouched: "onTouched";all: "all";
}

根据项目需求,开发者可自行选择触发方式,本例中使用的是all,即需要匹配所有触发方式。

三种表单验证的方法:

  1. 自定义的required的提示
validation={{required: "First Name is required!"}}
  1. 通过正则匹配来验证表单元素
validation={{pattern: {value: URL_REGEXP,message: 'Url is invalid!'}}}
  1. 通过自定义的验证规则来验证表单元素:
validation={{validate: validateLastNameLength
}}

通过以上三种方式,我们可以规定用户输入表单的值并提供自定义的错误提示。

何时能够点击提交按钮

react-hook-form-mui中,提供了简便的api去控制是否能够点击提交按钮。分别是:

  • formContext.formState.isValid: 验证表单元素是否合法。
  • formContext.formState.isDirty: 验证表单元素是否发生过改变。

通过这两种方法,我们可以很轻松地控制何时能够点击提交按钮。

总结

以上是关于React-hook-form-mui的表单验证的的用法。希望本文会对你有所帮助。如果有什么问题,可在下方留言沟通。

相关文章:

React-hook-form-mui(三):表单验证

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui的基础用法。本文将着重讲解表单验证功能。 react-hook-form-mui提供了丰富的表单验证功能&#xff0c;可以通过validation属性来设置表单验证规则。本文将详细介绍validation的三种实现方法&#xff0c;以及如何…...

【私域运营秘籍】4大用户调研方法,让你轻松掌握用户心理!

我们常说私域运营的核心是用户运营。根据二八法则&#xff0c;20%的超级用户贡献企业80%的利润。因此&#xff0c;企业应该根据用户的价值贡献来有针对性地进行运营。 然而&#xff0c;在实际的私域运营中&#xff0c;我们不仅需要找出贡献价值不同的用户&#xff0c;还可以从…...

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6 文章目录 2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6前言第1章 LCD简介1.1 LCD硬件接口介绍 第2章 LCD指令介绍第3章 LCD 8080驱动方式3.1 8080写时序3.2 8080读时序 第4章 LCD 驱动代码部分4.1 修改代码部分4.2 代码工程下载…...

Java利用TCP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为聊天。然后创建包&#xff0c;创建两个类&#xff0c;客户端&#xff08;SocketClient&#xff09;和服务器端&#xff08;SocketServer&#xff09; 二、实现代码 客户端代码&#xff1a; package 聊天; import ja…...

软件压力测试的重要性与用途

在当今数字化的时代&#xff0c;软件已经成为几乎所有行业不可或缺的一部分。随着软件应用规模的增加和用户数量的上升&#xff0c;软件的性能变得尤为关键。为了确保软件在面对高并发和大负载时仍然能够保持稳定性和可靠性&#xff0c;软件压力测试变得至关重要。下面是软件压…...

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第二次作业

1 设 F { A B → C , B → D , C D → E , C E → G H , G → A } F\{AB\rightarrow C,B\rightarrow D, CD\rightarrow E, CE\rightarrow GH, G\rightarrow A \} F{AB→C,B→D,CD→E,CE→GH,G→A}&#xff0c;用推理的方法证明 F ∣ A B → G F\;|AB\rightarrow G F∣AB→…...

Qt + MySQL(简单的增删改查)

Qt编译MySql插件教程 帮助&#xff1a; SQL Programming QSqlDatabase 静态函数 1.drivers()&#xff0c;得到可以使用的数据库驱动名字的集合 [static] QStringList QSqlDatabase::drivers();2.addDatabase()&#xff0c;添加一个数据库实例 [static] QSqlDatabase QSql…...

postgresql设置免密登录

您提供的步骤描述了在 PostgreSQL 数据库环境中配置服务器间的 SSH 无密码登录和数据库用户认证的过程。这些步骤主要用于设置一个高可用性、负载平衡的数据库集群环境。让我们逐一解释这些步骤的目的和应用场景&#xff1a; 1. 启动 PostgreSQL 服务 systemctl start postgr…...

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…...

机器学习-逻辑回归

一、引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的监督学习算法。尽管名字中含有“回归”二字&#xff0c;但这并不意味着它用于解决回归问题。相反&#xff0c;逻辑回归专注于解决二元或多元分类问题&#xff0c;如邮件是垃圾邮件还是…...

Edge调用Aria2下载

一、准备工作 1、Edge浏览器&#xff1a;Windows系统自带或点击下载&#xff1b;   2、Aria2 gui&#xff1a;点击github下载或自行搜索下载其他版本&#xff1b; 二、启动Aria2 gui 解压下载的Aria2 gui到任意目录&#xff0c;点击“Aria2c启动器”或“AriaNg启动器”皆可。…...

解密QQ号——C语言

题目&#xff1a; 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则&#xff1a;首先将第1个数字删除&#xff0c;紧接着将第2个数字放到这串数字的末尾&#xff0c;再将第3个数字删除并将第4个数字放到这串数字的末尾&#xff0c;再将第5个数删除 代码实现&#xff1a; #inc…...

三、jvm中的对象及引用

一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时&#xf…...

Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构&#xff0c;辅以演示&#xff0c;并简单介绍了网络管理中的命令。 前文&#xff1a; Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似&#xff0c;docker容器采用veth-pair linux bridge (虚拟交…...

Android studio新版本aar包导入项目中配置

目录 1、so、aar导入在项目build.gradle中配置 2、新版本迁移到setting.grade配置 1、so、aar导入在项目build.gradle中配置 repositories {flatDir {dirs libs} }2、新版本迁移到setting.grade配置 flatDir {dirs libs } 如下图所示 pluginManagement {repositories {gra…...

HBase-架构与设计

HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.表逻辑结构2.RowKey3.Column Family4.TimeStamp5.存储结构 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegi…...

SpringBoot基础系列:工具类使用

断言 Assert // 要求参数 object 必须为非空&#xff08;Not Null&#xff09;&#xff0c;否则抛出异常&#xff0c;不予放行 // 参数 message 参数用于定制异常信息。 void notNull(Object object, String message) // 要求参数必须空&#xff08;Null&#xff09;&#xff…...

使用 nohup java - jar 不输出日志

要在使用nohup java -jar命令时不输出日志&#xff0c;可以将标准输出和标准错误输出重定向到特殊设备文件/dev/null。这样做将会丢弃所有的输出。 以下是在Linux中使用nohup java -jar命令并禁止输出日志的示例&#xff1a; 复制代码 nohup java -jar your-application.jar …...

前端开发学习 (五) 生命周期函数、Ajax请求

关于vue实例的声明周期&#xff0c;从Vue实例创建、运行、到销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件&#xff0c;统称为生命周期 &#xff08;https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 &#xff09; 而声明周期勾子就是生命周期…...

TypeScript中的单件设计模式

基本概念 &#xff08;1&#xff09; 了解设计模式 设计模式通俗的讲&#xff0c;就是一种更好的编写代码方案&#xff0c;打个比喻&#xff1a;从上海到武汉&#xff0c;你可以选择做飞机&#xff0c;做轮船&#xff0c;开车&#xff0c;骑摩托车多种方式&#xff0c;把出行…...

Vision Mamba边缘部署:从算法瓶颈到专用硬件加速器设计

1. 项目概述&#xff1a;为什么我们需要为Vision Mamba定制硬件&#xff1f;在边缘设备上部署视觉大模型&#xff0c;听起来就像让一台家用轿车去跑F1赛道——动力、空间、散热&#xff0c;处处都是瓶颈。传统的Transformer架构&#xff0c;比如ViT&#xff0c;虽然性能强悍&am…...

Unity手游Mono堆泄漏:80MB硬限下的静默崩溃真相

1. 这不是GC没跑&#xff0c;是Mono堆在 silently 溢出——一个被90% Unity手游团队忽视的“假稳定”现象你有没有遇到过这样的情况&#xff1a;游戏在编辑器里跑得飞快&#xff0c;Profiler显示GC调用次数极少&#xff0c;内存曲线平滑得像湖面&#xff1b;但一打包到Android真…...

计算机视觉与贝叶斯优化驱动的粉末饮料智能制备系统

1. 项目概述&#xff1a;从“冲一杯”到“冲好一杯”的自动化跃迁“机器人结合计算机视觉与贝叶斯优化实现粉末饮料制备自动化”&#xff0c;这个标题听起来有点学术&#xff0c;但说白了&#xff0c;我们做的就是把冲奶粉、泡蛋白粉、调咖啡这类“凭感觉”的手工活&#xff0c…...

仓储海量货物人车混跑,无感定位并发能力碾压UWB上限瓶颈技术白皮书方案

仓储海量货物人车混跑&#xff0c;无感定位并发能力碾压UWB上限瓶颈技术白皮书方案一、方案概述随着现代智能仓储向高密度、高周转、无人化、集约化模式快速迭代&#xff0c;立体仓储库区普遍形成海量货物堆叠、多叉车穿梭、人员高频作业、人车密集混跑的复杂动态工况。仓储作业…...

RMAN 增量备份(Incremental Backup)

1、概念RMAN 增量备份是指 RMAN 只备份自上次备份以来发生过更改的数据块&#xff0c;而不是备份整个数据库的所有数据块。它是 Oracle 为解决大型数据库全量备份时间长、占用空间大的问题而设计的核心特性&#xff0c;也是现代企业级备份策略的基础。简单类比&#xff1a;全库…...

缓存设计:从 LRU 到 Redis 实战

摘要&#xff1a;缓存是提升系统性能的第一道防线&#xff0c;也是面试中系统设计环节的核心话题。本文系统讲解缓存的四大置换策略、LRU 和 LFU 的实现原理&#xff0c;并结合 Python 代码展示完整的缓存系统。AI 开发者还将学到 KV Cache 在 LLM 推理中的关键作用。一、为什么…...

数据类型与变量-Part3-输入输出格式化艺术

C语言输入输出格式化艺术系列导航 ✅ Part 1: C语言数据类型与变量&#xff08;基础篇&#xff09;✅ Part 2: C语言内存探秘&#xff08;进阶篇&#xff09;&#x1f4cd; Part 3: C语言输入输出格式化艺术 ← 你在这里上一篇我们深入了内存底层&#xff0c;这篇我们来聊聊你和…...

案发现场时空回溯:UWB无法全域留痕,无感定位全链路可复盘

案发现场时空回溯&#xff1a;UWB无法全域留痕&#xff0c;无感定位全链路可复盘镜像视界浙江科技有限公司&#xff0c;作为数字孪生、视频孪生领域底层原创技术核心供给方&#xff0c;依托国家十四五重点课题专项研究、镜像视界浙江普陀时空大数据应用技术联合研究院深度产学研…...

AI能力认知地图:从工具体验到工程落地的系统化拆解

1. 项目概述&#xff1a;这不是一份“AI工具清单”&#xff0c;而是一份可复用的AI能力认知地图你点开这篇文章&#xff0c;大概率不是为了收藏十个网站链接——而是想搞清楚&#xff1a;当AI能力已经像水电一样开始渗入日常工具链时&#xff0c;一个真实从业者该如何判断哪些能…...

Linux内核安全模块深入剖析【2.6】

第 11 章 Yama11.1 简介Yama 是一个源自古印度语的英文单词&#xff0c;翻译成汉语就是“阎罗”&#xff0c;阎罗是印度神话中掌管地狱的神。Yama 可以称为半个安全模块&#xff0c;说它是“半个”&#xff0c;原因是&#xff1a;&#xff08;1&#xff09;它是目前&#xff08…...