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实现表单验证案例

    JS实现表单验证是前端开发中经常用到的技术,可有效防止用户提交无效或不完整的数据。下面是一些实现表单验证的技巧。 第一步:获取表单元素 在JS中,使用DOM API获取表单元素非常简单。首先得到表单元素本身,然后可以通过表单的表单元素来访问表单元素。例如: const form = document.querySelector(‘form’); const …

    JavaScript 2023年6月10日
    00
  • javascript json2 使用方法

    下面是关于JavaScript中json2库的使用方法的详细攻略: 1. 什么是json2库? json2是一种JSON格式的解析器和序列化器的集合。该库把JSON格式转换为JavaScript对象,以及JavaScript对象转换成JSON格式。其中,json2.js是针对JSON对象在浏览器中的兼容性做的一个修复,当JSON对象在浏览器中使用时,当这个对…

    JavaScript 2023年5月27日
    00
  • jQuery和JavaScript节点插入元素的方法对比

    jQuery和JavaScript都可以通过节点插入元素来动态修改页面内容。下面将详细讲解jQuery和JavaScript节点插入元素的方法对比。 jQuery节点插入元素 jQuery的节点插入元素的方法主要有以下三个: 1. append() append()方法用于向元素的结尾插入内容,语法如下: $(selector).append(content…

    JavaScript 2023年6月10日
    00
  • JS函数节流和函数防抖问题分析

    JS函数节流和函数防抖问题分析 函数节流 函数节流是指在一定时间内只执行一次该函数。即使该函数被连续调用多次,但在规定的时间内,它只会执行一次。 函数节流比较适用于一些高频率触发的操作,例如: 滚动页面时触发的事件(scroll事件); 缩放浏览器窗口时触发的事件(resize事件); 拖动元素时触发的事件(drag事件)等。 下面是一个函数节流的示例代码:…

    JavaScript 2023年6月10日
    00
  • js页面跳转常用的几种方式

    下面是关于“js页面跳转常用的几种方式”的完整攻略。 一、背景 在web应用中,页面跳转是非常常见的操作。而在前端开发中,我们通常使用JavaScript来实现页面的跳转功能。本文将介绍js页面跳转的常用几种方式。 二、常用的几种方式 1.通过window.location.href实现页面跳转 代码形式如下: window.location.href = …

    JavaScript 2023年6月11日
    00
  • 利用Three.js制作一个新闻联播开头动画

    利用Three.js制作一个新闻联播开头动画需要按照以下步骤进行: 1. 准备工作 首先,需要在前端项目中引入Three.js。可以通过CDN或者npm安装来引入Three.js。其次,需要在HTML文档中创建一个容器元素,如div,作为渲染这个场景的容器。 在JS文件中,需要定义渲染器、摄像机、场景,以及需要展示的物体。同时需要设置动画帧数,并创建相应的动…

    JavaScript 2023年6月11日
    00
  • 谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)

    JSON是一种轻量级的数据交换格式,提供了在不同编程语言之间交换数据的标准格式。在JavaScript中,JSON对象提供了一种方便的方式将JavaScript对象转换成JSON格式的字符串或者将JSON格式的字符串转换成JavaScript对象。而JSON.stringify()和JSON.parse()就是这两种转换方式。 JSON.stringify(…

    JavaScript 2023年5月27日
    00
  • JavaScript实现表单注册、表单验证、运算符功能

    下面是JavaScript实现表单注册、表单验证、运算符功能的完整攻略。 表单注册 表单注册流程一般包括以下步骤: 创建表单:在HTML页面中创建表单元素,包括form、input等。 获取表单数据:使用JavaScript获取表单中的各项数据,例如表单中的各个输入框和选择框的值。 验证表单数据:检查表单数据的格式和内容是否符合要求。 提交表单数据:将表单数…

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