ant-design-pro 的EditableProTable表格验证调用的实现代码

Ant Design Pro 的 EditableProTable 组件提供了表格验证的功能,其实现的关键在于将验证规则通过装饰器传递给 EditableTable 组件。下面是具体实现步骤:

  1. 安装依赖

在项目中增加对 rc-formformik 包的依赖。

npm i rc-form formik
  1. 创建验证规则

可通过使用 formik 包中提供的 object() 函数来创建验证规则。以下代码演示了如何验证一个邮箱地址和一个数字:

import { object, string, number } from "formik";

const validationSchema = object().shape({
  email: string().email("不合法的邮箱地址"),
  num: number().moreThan(0, "数字必须大于零"),
});

在以上的代码中,validationSchema 将会验证一个对象,在这个对象中,email 必须是合法的邮箱地址,num 则必须大于 0。

  1. 将验证规则和表格结合

在 EditableProTable 组件中增加 recordCreatorProps 属性,之后在其中指定规则对象。

import { EditableProTable } from "@ant-design/pro-table";
import { FormikProvider, useFormik } from "formik";

function EditableTable({ dataSource }: { dataSource: any[] }) {
  const validationSchema = object().shape({
    email: string().email("不合法的邮箱地址"),
    num: number().moreThan(0, "数字必须大于零"),
  });
  const [form] = useFormik({
    validationSchema,
  });

  return (
    <FormikProvider value={form}>
      <EditableProTable
        recordCreatorProps={{
          record: {},
          position: "top",
          newRecordType: 'dataSource',
          validator: validationSchema.validateSync
        }}
        columns={[
          {
            title: "文本",
            dataIndex: "text",
            formItemProps: {
              rules: [{ required: true, message: "请填写文本" }],
            },
            width: 100,
            editable: true,
          },
          {
            title: "邮箱",
            dataIndex: "email",
            formItemProps: {
              rules: [{ required: true, message: "请填写邮箱" }],
            },
            width: 300,
            editable: true,
          },
          {
            title: "数字",
            dataIndex: "num",
            formItemProps: {
              rules: [{ required: true, message: "请填写数字" }],
            },
            width: 100,
            editable: true,
          },
        ]}
        dataSource={dataSource}
        editable={{
          type: "multiple",
          editableKeys,
          onBlur: async () => {
            for (let i = 0; i < editableKeys.length; i++) {
              const key = editableKeys[i];
              await formik.submitForm();
              if (formik.errors[key]) {
                // 处理验证失败的结果
              } else {
                // 处理验证成功的结果
              }
            }
            // 清除列表的当前编辑状态
            setEditableKeys([]);
            setEditingKey("");
          },
        }}
      />
    </FormikProvider>
  );
}

在以上的代码中,我们将验证规则对象传递给了 EditableProTable 组件的 recordCreatorProps 属性,并且指定了校验的函数 validator。同时,在 columns 数组中,我们也指定了每个字段对应的验证规则。

  1. 处理验证结果

onBlur 属性中,我们需要处理每个编辑状态下的验证结果。若验证通过,则继续执行其他操作;若验证失败,则需要执行需要的错误处理代码。

以上就是 EditableProTable 组件验证的全部实现。接下来我们看一下两个具体的示例:

示例1

在这个示例中,我们将会创建一个可以填写和修改用户信息的表格,并新增了对邮箱、手机号和身份证号码的验证。

创建验证规则

import { object, string, number } from "formik";

const validationSchema = object().shape({
  name: string().required("姓名不能为空"),
  email: string().email("不合法的邮箱地址"),
  mobile: string().matches(/^[1][0-9]{10}$/, "不合法的手机号码"),
  idCard: string().matches(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, "不合法的身份证号码"),
});

创建表格

import { EditableProTable } from "@ant-design/pro-table";
import { FormikProvider, useFormik } from "formik";

function EditableTable({ dataSource }: { dataSource: any[] }) {
  const validationSchema = object().shape({
    name: string().required("姓名不能为空"),
    email: string().email("不合法的邮箱地址"),
    mobile: string().matches(/^[1][0-9]{10}$/, "不合法的手机号码"),
    idCard: string().matches(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, "不合法的身份证号码"),
  });
  const [editableKeys, setEditableKeys] = useState([]);
  const [editingKey, setEditingKey] = useState("");

  const [form] = useFormik({
    validationSchema,
  });

  return (
    <FormikProvider value={form}>
      <EditableProTable
        rowKey="id"
        recordCreatorProps={{
          record: {},
          position: "top",
          newRecordType: 'dataSource',
          validator: validationSchema.validateSync
        }}
        columns={[
          {
            title: "姓名",
            dataIndex: "name",
            formItemProps: {
              rules: [{ required: true, message: "请填写姓名" }],
            },
            width: 150,
            editable: true,
          },
          {
            title: "邮箱",
            dataIndex: "email",
            formItemProps: {
              rules: [{ required: true, message: "请填写邮箱" }],
            },
            width: 300,
            editable: true,
          },
          {
            title: "手机号码",
            dataIndex: "mobile",
            formItemProps: {
              rules: [{ required: true, message: "请填写手机号码" }],
            },
            width: 160,
            editable: true,
          },
          {
            title: "身份证号码",
            dataIndex: "idCard",
            formItemProps: {
              rules: [{ required: true, message: "请填写身份证号码" }],
            },
            width: 200,
            editable: true,
          },
        ]}
        dataSource={dataSource}
        editable={{
          type: "multiple",
          editableKeys,
          onBlur: async () => {
            for (let i = 0; i < editableKeys.length; i++) {
              const key = editableKeys[i];
              await formik.submitForm();
              if (formik.errors[key]) {
                // 处理验证失败的结果
              } else {
                // 处理验证成功的结果
              }
            }
            // 清除列表的当前编辑状态
            setEditableKeys([]);
            setEditingKey("");
          },
        }}
      />
    </FormikProvider>
  );
}

注意,由于 EditableProTable 组件依赖于 formik,因此在 FormikProvider 中引入 formik

示例2

在这个示例中,我们将会演示 EditableProTable 组件如何实现联级验证。当填写的是同样基于省、市、区(县)的地址时,需要保证省和市是必填项,并且区(县)是省和市选择后的必填项。

创建验证规则

import { object, string } from "formik";

const regionValidationSchema = object().shape({
  province: string().required("省份不能为空"),
  city: string().required("城市不能为空"),
  district: string().required("区县不能为空"),
});

创建表格

import { EditableProTable } from "@ant-design/pro-table";
import { FormikProvider, useFormik } from "formik";

function EditableTable({ dataSource }: { dataSource: any[] }) {
  const [editableKeys, setEditableKeys] = useState([]);
  const [editingKey, setEditingKey] = useState("");

  const [regionForm] = useFormik({
    validationSchema: regionValidationSchema,
  });
  const [form] = useFormik({
    validationSchema: [
      (values) => {
        if (values.addressType === "region") {
          return regionValidationSchema;
        } else {
          return object();
        }
      },
    ],
  });

  return (
    <>
      <FormikProvider value={regionForm}>
        <EditableProTable
          rowKey="id"
          recordCreatorProps={{
            record: {},
            position: "top",
            newRecordType: 'dataSource',
            validator: regionValidationSchema.validateSync // 指定验证规则
          }}
          columns={[
            {
              title: "省份",
              dataIndex: "province",
              formItemProps: {
                rules: [{ required: true, message: "请选择省份" }],
              },
              width: 150,
              editable: true,
            },
            {
              title: "城市",
              dataIndex: "city",
              formItemProps: {
                rules: [{ required: true, message: "请选择城市" }],
              },
              width: 150,
              editable: true,
            },
            {
              title: "区县",
              dataIndex: "district",
              formItemProps: {
                rules: [{ required: true, message: "请选择区县" }],
              },
              width: 150,
              editable: true,
            },
          ]}
          dataSource={dataSource}
          editable={{
            type: "single",
            editableKeys,
            onBlur: async (record, index) => {
              if (record.addressType === "region") {
                await regionForm.submitForm();
              }
              await form.submitForm();
              if (formik.errors[index]) {
                // 处理验证失败的结果
              } else {
                // 处理验证成功的结果
              }
              setEditableKeys([]);
              setEditingKey("");
            },
          }}
        />
      </FormikProvider>
      <FormikProvider value={form}>
        <div>
          地址类型:
          <Radio.Group
            name="addressType"
            options={[
              { label: "地址", value: "address" },
              { label: "省/市/区县", value: "region" },
            ]}
          />
        </div>
      </FormikProvider>
    </>
  );
}

在以上的代码中,我们定义了两个验证规则 validationSchemaregionValidationSchema,前者仅校验地址类型为实际地址时的字段,后者仅校验地址类型为省、市、区县时的省、市和区县字段。同时我们使用 formik 包中提供的 object 函数,在地址类型设置为实际地址的时候,不进行任何验证。

在代码中,我们通过维护两个 FormikProvider 包裹的表单,实现了表格内单独验证。EditableProTable 组件加入 onBlur 监听事件,当失去编辑框焦点时,将这个表单进行提交,并处理验证结果。同时,我们在页面上添加了一个单选框,用于选择地址类型进行验证。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ant-design-pro 的EditableProTable表格验证调用的实现代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS实现n秒后自动跳转的两种方法

    下面我将针对“JS实现n秒后自动跳转的两种方法”进行详细讲解。 方法一:使用setTimeout()方法 我们可以使用JS的setTimeout()方法来实现n秒后自动跳转,具体操作步骤如下: 在页面中添加JS代码,定义计时器,并使用setTimeout()方法来实现需要跳转的URL地址。 <script> // 设置跳转的URL地址 var t…

    JavaScript 2023年5月27日
    00
  • jQuery 开发者应该注意的9个错误

    jQuery 开发者应该注意的9个错误 引入jQuery的方式错误 错误的方式如下: <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> 在上述代码的例子中,我们通过引入了互联网上的jquery库来使用它。这种方式是错误的,因为该方…

    JavaScript 2023年6月10日
    00
  • jquery中validate与form插件提交的方式小结

    来详细讲解一下“jquery中validate与form插件提交的方式小结”的完整攻略。 一、什么是jQuery Validation? jQuery Validation 是一个非常流行的 jQuery 表单验证插件,它可以帮助我们验证用户输入的数据是否合法。使用jQuery Validation可以方便地进行表单验证,使用方式简单易懂,可以兼容不同浏览器…

    JavaScript 2023年6月10日
    00
  • 利用JS实现浏览器的title闪烁

    要实现浏览器中Title的闪烁,可以使用 JavaScript 语言来完成。下面是两种实现闪烁效果的方式。 方式一:使用 setInterval 实现闪烁效果 <script> // 定义变量 var title = document.title; var char = ‘●’; // 闪烁字符 var timer = null; // 创建函数…

    JavaScript 2023年6月11日
    00
  • JavaScript 经典实例日常收集整理(常用经典)

    “JavaScript 经典实例日常收集整理(常用经典)” 是一份经典的 JavaScript 实例集合,本文将为大家提供一份完整攻略,帮助你理解它的用法和功能。 简介 “JavaScript 经典实例日常收集整理(常用经典)” 是一份在线的代码集合,包含了许多常见的 JavaScript 实例。这些实例涵盖了从基础入门到高级应用的方方面面,非常适合初学者学…

    JavaScript 2023年5月18日
    00
  • 推荐10 款 SVG 动画的 JavaScript 库

    标题:推荐10款SVG动画的JavaScript库 介绍:本文将会介绍10个优秀的SVG动画的JavaScript库,使你可以更好的在网站中使用SVG动画。我们将从这些库的特点和优点开始,然后根据需求来选择最适合你的库,同时也会提供几个实例来更好的了解这些库。 一、Snap.svgSnap.svg 是一个基于 SVG 元素的 JavaScript 库。它是一…

    JavaScript 2023年6月10日
    00
  • 特殊日期提示功能的实现方法

    实现特殊日期提示功能的方法有很多种,但是在网站开发中,常用的方法主要有以下两种: 1. 使用 JavaScript 和 CSS 实现 步骤 在 HTML 中的 head 标签内引入 CSS 文件,用于设置日期提示框的样式; 在 body 标签内设置一个容器,用于存放日期提示框; 在 JavaScript 文件中实现以下逻辑: 获取当前日期,并根据需要将其转换…

    JavaScript 2023年6月10日
    00
  • 行为型:策略模式

    定义   定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。   算法:就是写的逻辑可以是你任何一个功能函数的逻辑 封装:就是把某一功能点对应的逻辑给抽出来 可替换:建立在封装的基础上,这些独立的算法可以很方便的替换 通俗的理解就是,把你的算法(逻辑)封装到不同的策略中,在不同的策略中是互相独立的,这样我们封装的每一个算法是可以很方便的复用。 …

    JavaScript 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部