Ant-Design-Pro中:EditableProTable在ProForm保存时一并验证EditableProTable中每条数据的规则是否满足

论坛 期权论坛 期权     
选择匿名的用户   2021-6-2 17:15   9041   0

注:EditableProTable默认是在单行保存时调用表单验证,如下图:

现在项目有个需求:是点击EditableProTable外部的保存按钮对整个表单进行验证,实现效果如下:

思路如下:

EditableProTable提供了editable属性,可以设置form属性:官网地址

实现代码如下,复制可直接运行):

import React, { useState, } from 'react';
import { FooterToolbar, } from '@ant-design/pro-layout';
import ProCard from '@ant-design/pro-card';
import { Button, Row, Col, Form, message, } from 'antd';
import ProForm, { ProFormText, } from '@ant-design/pro-form';
import type { ProColumns, } from '@ant-design/pro-table';
import { EditableProTable } from '@ant-design/pro-table'

const EditableProTableDemo: React.FC = () => {
    const [editForm] = Form.useForm();
    const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
    const [dataSource, setDataSource] = useState<any>([]);

    const columns: ProColumns[] = [
        {
            title: '类型',
            dataIndex: 'type',
            align: 'center',
            valueType: 'select',
            valueEnum: {
                1: { text: '类型A', },
                2: { text: '类型B', },
            },
            formItemProps: {
                rules: [
                    { required: true, message: '请选择类型' },
                ],
            },
            fieldProps: {
                allowClear: false,
            },
        },
        {
            title: '名称',
            dataIndex: 'name',
            formItemProps: {
                rules: [
                    { required: true, message: '请输入名称' },
                    { max: 10, message: '最长10个字段', },
                ],
            },
        }
    ];

    return (
        <ProForm
            onFinish={
                async (values) => {
                    console.log(values);
                }
            }
            initialValues={{}}
            submitter={
                {
                    render: (props, dom) =>
                        <FooterToolbar>
                            <Button
                                key='save'
                                onClick={async () => {
                                    // 调用表单验证
                                    try {
                                        await editForm.validateFields().then(() => {
                                            props.form?.submit?.();
                                        });
                                    } catch (err) {
                                        message.info('请正确填写可编辑表格信息 ):');
                                    }
                                }}
                            >
                                保存
                            </Button>
                        </FooterToolbar>
                }
            }
        >
            <ProCard
                className='card'
                headerBordered
                title='普通Form信息'
            >
                <Row gutter={24} >
                    <Col span={12} xs={24} sm={24} md={12} lg={12} xl={12} xxl={12}>
                        <ProFormText
                            name='name_full'
                            label='全称'
                            rules={[{ required: true, message: '请输入全称' },]}
                            fieldProps={
                                {
                                    placeholder: '请输入全称',
                                    maxLength: 20,
                                }
                            }
                        />
                    </Col>
                </Row>
            </ProCard>
            <ProCard
                className='card'
                headerBordered
                title='EditableProTable可编辑表格信息'
            >
                <EditableProTable
                    columns={columns}
                    rowKey='id'
                    value={dataSource}
                    recordCreatorProps={{
                        newRecordType: 'dataSource',
                        record: () => ({
                            id: Date.now(),
                        }),
                    }}
                    editable={{
                        type: 'multiple',
                        form: editForm,
                        editableKeys,
                        actionRender: (row, config, defaultDoms) => {
                            return [defaultDoms.delete]
                        },
                        onValuesChange: (record, recordList) => {
                            setDataSource(recordList);
                        },
                        onChange: (editableKeyss, editableRows) => {
                            setEditableRowKeys(editableKeyss);
                            setDataSource(editableRows);
                        },
                    }}
                    bordered={true}
                />
            </ProCard>
        </ProForm>
    );
};

export default EditableProTableDemo;

关键代码段有如下几个:

const [editForm] = Form.useForm();
form: editForm,
onClick={async () => {
    // 调用表单验证
    try {
        await editForm.validateFields().then(() => {
            props.form?.submit?.();
        });
    } catch (err) {
        message.info('请正确填写可编辑表格信息 ):');
    }
}}

完结撒花~~~

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP