useDynamicList+table实现动态表格编辑

useDynamicList官网

Demo

import { MinusCircleOutlined, PlusCircleOutlined, PlusOutlined } from '@ant-design/icons';
import { useDynamicList } from 'ahooks';
import { Button, Form, Input, InputNumber, Space, Table } from 'antd';
import React, { useEffect, useState } from 'react';

interface Item {
    firstName?: string
    code?: string
    age?: Number
}
const mockData = [
    { firstName: 'Maray', code: 'PYHDF', age: 12 },
    { firstName: '小红', code: 'CVGDJK', age: 18 },
]

export default () => {
    const [form] = Form.useForm();
    const [dataSource, setDataSource] = useState([]);

    const [result, setResult] = useState('');

    const { list, remove, push, getKey, sortList, unshift, resetList } = useDynamicList(mockData);

    // useEffect(() => {
    //     // 初始化赋值
    //     resetList(mockData)
    // }, [])

    const columns = [
        {
            title: "名称",
            dataIndex: 'firstName',
            key: 'firstName',
            render(text: string, row: Item, index: number) {
                return (
                    <Form.Item required name={['params', getKey(index), 'firstName']} initialValue={text} noStyle>
                        <Input placeholder='firstName' style={{ width: '120px', marginRight: 16 }} />
                    </Form.Item>
                )
            }
        },
        {
            title: "Code",
            dataIndex: 'code',
            key: 'code',
            render(text: string, row: Item, index: number) {
                return (
                    <Form.Item required name={['params', getKey(index), 'code']} initialValue={text} noStyle>
                        <Input placeholder='code' style={{ width: '120px', marginRight: 16 }} />
                    </Form.Item>
                )
            }
        },
        {
            title: "年龄",
            dataIndex: 'age',
            key: 'age',
            render(text: number, row: Item, index: number) {
                return (
                    <>
                        <Form.Item required name={['params', getKey(index), 'age']} initialValue={text} noStyle>
                            <InputNumber min={1} style={{ width: '120px', marginRight: 16 }} />
                        </Form.Item>
                        <Button.Group>
                            <Button danger onClick={() => remove(index)}>删除</Button>
                        </Button.Group>
                    </>
                )
            }
        },
    ]
    return (
        <>
            <Form form={form} onFinish={(val) => {
                console.log('val', val)
                const sortResult = sortList(val.params);
                setResult(JSON.stringify(sortResult, null, 2));
                console.log('resule', JSON.stringify(sortResult, null, 2))
            }}>
                <Table
                    dataSource={list}
                    columns={columns}
                    rowKey={(r: Item, index: number) => { getKey(index).toString() }}
                />
                <Form.Item>
                    <Button type='dashed'
                        onClick={() => {
                            // push({ firstName: '', code: '', age: 12 })
                            unshift({ firstName: '', code: '', age: 12 }) //开头追加
                        }}
                        icon={<PlusOutlined />}>
                        添加一行
                    </Button>
                </Form.Item>
                <Form.Item>
                    <Button htmlType='submit' type='primary'>提交</Button>
                </Form.Item>
            </Form>
        </>
    );
};

效果图

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值