antd 4.x, 实现Table 可编辑 , Table 结合Form.List,实现单独校验Form.List、Form.Item校验

背景:

需要实现一个这种表格 在这里插入图片描述

思路:

1、编辑表格
	antd 有案例	
2、Form.List 嵌套Table 

实现

关键点: 单行校验怎么传参 ,单行如何获取值、 单行如何重置
注意: 我的form 是从外层传进来的 、这个没有影响 正常在 Form.List 外层加Form 组件包裹就行

import React from 'react'
import { Form, Input, Button, Table, Select, Upload,message } from 'antd'
// import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'
import UploadFile from '../UploadFile/index'
import { GetCertificate,  SaveCertificate} from '@services/configure/configurationManagement'

const formItemLayout = {
    labelCol: {
        span: 3,
    },
    wrapperCol: {
        span: 24,
    },
} 

const TableEditForm = (props) => {
    // const [form] = Form.useForm()
    const { form} = props


// 单行校验 传参
    const validateForm =(record,field)=>{
        form.validateFields(
            [
                ['CertificateList',field.key,'pemName'],
                ['CertificateList',field.key,'keyName']
            ])
            .then(res=>{
                // 得到单行的数据
            })
            .catch(err=>{
                console.log(err,'dss')
            })
    }

 

    const getColumns = (add, remove) => {
        return [
            {
                title: '域名',
                dataIndex: 'domain',
                render(text, field, index) {
                    // 注意:这里的 field 不是当前行数据,而是 Form.List field
                    return <Form.Item
                        wrapperCol={ { span: 24 } }
                        shouldUpdate
                    >
                        {({ getFieldValue }) => {
                            // 获取当前行数据,然后渲染你要的数据
                            const record = (getFieldValue('CertificateList') || [])?.[index] || {}
                            return  record?.['domain']
                        }}
                    </Form.Item>
                }
            },
            {
                title: '证书(仅支持.pem格式)',
                dataIndex: 'pemName',
                render(text, field, index) {
                    return <Form.Item
                        wrapperCol={ { span: 24 } }
                        name={ [field.name, 'pemName'] }
                        rules={ [{ required: true, message: '请上传证书(仅支持.pem格式)' }] }
                    >
                        <UploadFile />
                    </Form.Item>
                }
            },
            {
                title: '证书秘钥(仅支持.key格式)',
                dataIndex: 'keyName',
                render(text, field, index) {
                    return <Form.Item
                        wrapperCol={ { span: 24 } }
                        shouldUpdate
                        name={ [field.name, 'keyName'] }
                        rules={ [{ required: true, message: '请上传证书秘钥(仅支持.key格式)' }] }
                        // valuePropName="fileList"
                        // getValueFromEvent={normFile}
                    >
                        <UploadFile />
                    </Form.Item>
                }
            },
            {
                title: '过期时间',
                dataIndex: 'expireTime',
                render(text, field, index) {
                    return <Form.Item
                        wrapperCol={ { span: 24 } }
                        shouldUpdate
                    >
                        {({ getFieldValue }) => {
                            const record = (getFieldValue('CertificateList') || [])?.[index] || {}
                            return  record?.['expireTime']
                        }}
                    </Form.Item>
                }
            },
            {
                title: '操作',
                dataIndex: 'operate',
                className: 'operate',
                width: 120,
                render(text, field, index) {
                    // 注意:这里的 field 不是当前行数据,而是 Form.List field
                    return <Form.Item
                        wrapperCol={ { span: 24 } }
                        shouldUpdate
                    >
                        {({ getFieldValue }) => {
                            // 获取当前行数据,然后渲染你要的数据
                            const record = (getFieldValue('CertificateList') || [])?.[index] || {}
                            return <div>
                                <a href="#" key={1} onClick={() => {
                                    form.resetFields(  [
                                        ['CertificateList',field.key,'pemName'],
                                        ['CertificateList',field.key,'keyName']
                                    ])
                                }}> 清空</a>
                                <a href='#' key={2} onClick={() => {
                                    validateForm(record,field)
                                }}> 保存</a>
                            </div>
                        }}
                    </Form.Item>
                }
            }
        ]
    }
 
    return (
        <>
            <Form.List name='CertificateList' {...formItemLayout}>
                { (fields, { add, remove }) => {
                    // 将Table视为 Form.List 中循环的 Form.Item
                    return (
                        <Table
                            dataSource={ fields }
                            columns={ getColumns(add, remove) }
                            rowKey='key'
                            pagination={false}
                        />
                    )
                }}
            </Form.List>
        </>
    )
}
 
export default TableEditForm```

antd Form.List 中,一个 Form.Item 可以通过使用 getFieldDecorator 方法来获取自身的值,而获取其他 Form.Item 的值则需要通过 Form.List 的方法进行。例如,可以通过调用 form.getFieldValue 方法来获取其他 Form.Item 的值。具体实现步骤如下: 1. 在 Form.List 中,给每个 Form.Item 一个唯一的 name 属性,例如 name={`items[${index}].name`},其中 index 为当前 Form.Item 的索引。 2. 在 getFieldDecorator 方法中,使用 getFieldValue 方法来获取其他 Form.Item 的值。示例代码如下: ```jsx {getFieldDecorator(`items[${index}].name`, { initialValue: item.name, rules: [{ required: true, message: 'Please input name' }], })( <Input placeholder="Enter name" /> )} {getFieldDecorator(`items[${index}].age`, { initialValue: item.age, rules: [{ required: true, message: 'Please input age' }], })( <InputNumber placeholder="Enter age" min={0} /> )} {getFieldDecorator(`items[${index}].email`, { initialValue: item.email, rules: [{ required: true, message: 'Please input email' }], })( <Input placeholder="Enter email" /> )} ``` 3. 在需要获取其他 Form.Item 值的地方,调用 form.getFieldValue 方法。示例代码如下: ```jsx const handleSubmit = e => { e.preventDefault(); form.validateFields((err, values) => { if (!err) { // 获取其他 Form.Item 值 const names = form.getFieldValue('items').map(item => item.name); console.log(names); // 提交表单 console.log('Received values of form: ', values); } }); }; ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值