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

HOW - Form 表单确认校验两种模式(以 Modal 场景为例)

目录

  • 一、背景
  • 二、具体
    • 1. 模式一:点击确认进行校验提示
    • 2. 模式二:确认按钮依赖于表单内容
    • 实现说明

一、背景

基于react、antd form分别实现如下两种模式:

  • 1、一个 Modal,点击确认进行校验提示
  • 2、一个 Modal,确认按钮依赖于表单内容,必填项都有值才可点击

二、具体

以下是基于 React 和 Ant Design 的两种模式实现:

1. 模式一:点击确认进行校验提示

import React, { useState } from "react";
import { Modal, Form, Input, Button, message } from "antd";const DialogWithValidation = () => {const [visible, setVisible] = useState(false);const [form] = Form.useForm();const handleOk = () => {form.validateFields().then(() => {message.success("校验通过,提交成功!");setVisible(false);form.resetFields();}).catch((errorInfo) => {message.error("校验未通过,请检查输入!");});};return (<><Button type="primary" onClick={() => setVisible(true)}>打开对话框</Button><Modaltitle="模式一:校验提示"visible={visible}onCancel={() => setVisible(false)}onOk={handleOk}okText="确认"cancelText="取消"><Form form={form} layout="vertical"><Form.Itemlabel="姓名"name="name"rules={[{ required: true, message: "请输入姓名!" }]}><Input placeholder="请输入姓名" /></Form.Item><Form.Itemlabel="邮箱"name="email"rules={[{ required: true, message: "请输入邮箱!" },{ type: "email", message: "请输入有效的邮箱地址!" },]}><Input placeholder="请输入邮箱" /></Form.Item></Form></Modal></>);
};export default DialogWithValidation;

2. 模式二:确认按钮依赖于表单内容

可以参考 Antd form - 仅校验 例子。主要是利用 validateFieldsvalidateOnly 动态调整提交按钮的 disabled 状态:

const SubmitButton: React.FC<React.PropsWithChildren<SubmitButtonProps>> = ({ form, children }) => {const [submittable, setSubmittable] = React.useState<boolean>(false);// Watch all valuesconst values = Form.useWatch([], form);React.useEffect(() => {form.validateFields({ validateOnly: true }).then(() => setSubmittable(true)).catch(() => setSubmittable(false));}, [form, values]);return (<Button type="primary" htmlType="submit" disabled={!submittable}>{children}</Button>);
};

也可以监听 onFieldsChange

import React, { useState } from "react";
import { Modal, Form, Input, Button } from "antd";const DialogWithDisableButton = () => {const [visible, setVisible] = useState(false);const [isFormValid, setIsFormValid] = useState(false);const [form] = Form.useForm();const handleFieldsChange = () => {form.validateFields().then(() => {setIsFormValid(true);}).catch(() => {setIsFormValid(false);});};const handleOk = () => {Modal.success({title: "提交成功",content: "所有必填项都已填写!",});setVisible(false);form.resetFields();setIsFormValid(false);};return (<><Button type="primary" onClick={() => setVisible(true)}>打开对话框</Button><Modaltitle="模式二:按钮依赖表单"visible={visible}onCancel={() => setVisible(false)}onOk={handleOk}okButtonProps={{ disabled: !isFormValid }}okText="确认"cancelText="取消"><Formform={form}layout="vertical"onFieldsChange={handleFieldsChange}><Form.Itemlabel="姓名"name="name"rules={[{ required: true, message: "请输入姓名!" }]}><Input placeholder="请输入姓名" /></Form.Item><Form.Itemlabel="邮箱"name="email"rules={[{ required: true, message: "请输入邮箱!" },{ type: "email", message: "请输入有效的邮箱地址!" },]}><Input placeholder="请输入邮箱" /></Form.Item></Form></Modal></>);
};export default DialogWithDisableButton;

实现说明

  1. 模式一

    • 点击“确认”后会触发校验逻辑。
    • 校验通过后显示成功提示,否则提示错误信息。
  2. 模式二

    • 使用 onFieldsChange 方法监听表单变化。
    • 如果所有必填项都有值且校验通过,启用“确认”按钮;否则按钮保持禁用状态。
http://www.lryc.cn/news/518888.html

相关文章:

  • LabVIEW部署Web服务
  • 进程件通信——网络通信——TCP
  • 【数据库】三、SQL语言
  • Python对象的序列化和反序列化工具:Joblib与Pickle
  • Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
  • 量子计算遇上人工智能:突破算力瓶颈的关键?
  • 【Unity插件】解决移动端UI安全区问题 - Safe Area Helper
  • JSON.stringify 实现深度克隆的缺陷
  • 深度解析如何使用Linux中的git操作
  • el-table 合并单元格
  • Redis 三大问题:缓存穿透、缓存击穿、缓存雪崩
  • 常用字符串处理函数
  • Pathview包:整合表达谱数据可视化KEGG通路
  • seleniun 自动化程序,python编程 我监控 chrome debug数据后 ,怎么获取控制台的信息呢
  • SQL中的数据库对象
  • DeepSeek:性能强劲的开源模型
  • 医疗可视化大屏 UI 设计新风向
  • 从企业级 RAG 到 AI Assistant , Elasticsearch AI 搜索技术实践
  • TypeScript语言的并发编程
  • benchANT 性能榜单技术解读 Part 1:写入吞吐
  • 虚拟机防火墙管理
  • Nginx反向代理请求头有下划线_导致丢失问题处理
  • 【STM32+CubeMX】 新建一个工程(STM32F407)
  • 机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构
  • H2数据库在单元测试中的应用
  • 部署HugeGraph
  • 2025年第三届“华数杯”国际赛A题解题思路与代码(Matlab版)
  • 嵌入式基础 -- IMX8MP的 GPC 模块技术
  • 选择器css
  • 全方位解读消息队列:原理、优势、实例与实践要点