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

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>
      <Modal
        title="模式一:校验提示"
        visible={visible}
        onCancel={() => setVisible(false)}
        onOk={handleOk}
        okText="确认"
        cancelText="取消"
      >
        <Form form={form} layout="vertical">
          <Form.Item
            label="姓名"
            name="name"
            rules={[{ required: true, message: "请输入姓名!" }]}
          >
            <Input placeholder="请输入姓名" />
          </Form.Item>
          <Form.Item
            label="邮箱"
            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 values
  const 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>
      <Modal
        title="模式二:按钮依赖表单"
        visible={visible}
        onCancel={() => setVisible(false)}
        onOk={handleOk}
        okButtonProps={{ disabled: !isFormValid }}
        okText="确认"
        cancelText="取消"
      >
        <Form
          form={form}
          layout="vertical"
          onFieldsChange={handleFieldsChange}
        >
          <Form.Item
            label="姓名"
            name="name"
            rules={[{ required: true, message: "请输入姓名!" }]}
          >
            <Input placeholder="请输入姓名" />
          </Form.Item>
          <Form.Item
            label="邮箱"
            name="email"
            rules={[
              { required: true, message: "请输入邮箱!" },
              { type: "email", message: "请输入有效的邮箱地址!" },
            ]}
          >
            <Input placeholder="请输入邮箱" />
          </Form.Item>
        </Form>
      </Modal>
    </>
  );
};

export default DialogWithDisableButton;

实现说明

  1. 模式一

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

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

http://www.kler.cn/a/488823.html

相关文章:

  • Java(4)抽象类与接口
  • StarRocks Awards 2024 年度贡献人物
  • 有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗
  • [大模型]本地离线运行openwebui+ollama容器化部署
  • mybatisX插件的使用,以及打包成配置
  • WebSocket监听接口
  • Eureka缓存机制
  • RabbitMQ 在 Go 中的核心方法详解
  • 【AIGC-ChatGPT进阶提示词指令】命运之轮:一个融合神秘与智慧的对话系统设计
  • 安科瑞Acrel-1000DP分布式光伏监控系统在浙江安吉成3234.465kWp分布式光伏发电项目中的应用
  • 在 Ubuntu 上对 Nginx 进行源码编译的详细指南
  • 代码随想录刷题day04|(数组篇)209.长度最小的子数组
  • PDF转文本以及转图片:itextpdf
  • 【EXCEL 向下合并制定列的空白内容】
  • C++例程:使用I/O模拟IIC接口(6)
  • Win10本地部署大语言模型ChatGLM2-6B
  • [豆包MarCode AI 刷题] 算法题解 Java 青训入营考核 五题打卡第三天
  • 网络安全:守护数字世界的防线
  • 【react-pdf】实现在线pdf加载——翻页加载和下拉滚动加载
  • Vue.js组件开发-实现滚动加载下一页
  • HOW - Form 表单 label 和 wrapper 对齐场景
  • 统信桌面常用运维命令
  • 【华为OD-E卷 - 服务失效判断 100分(python、java、c++、js、c)】
  • LeetCode 747. 至少是其他数字两倍的最大数
  • C++—14、C++ 中的指针最基础的原理
  • React 元素渲染