antd ProTable 高级表单实现行编辑表格(能直接用调用接口那种)

逻辑全部梳理了,代码全部如下,可以直接粘贴使用:

import React, { useState } from 'react';
import { EditableProTable } from '@ant-design/pro-table';
import ProField from '@ant-design/pro-field';
import { ProFormRadio } from '@ant-design/pro-form';
import ProCard from '@ant-design/pro-card';
import { Button } from 'antd';
import { bgBlack } from 'chalk';


const defaultData = [];
for (let i = 0; i < 100; i += 1) {
    defaultData.push({
        id: i,
        title: '活动名称' + i,
        decs: '这个活动真好玩',
        state: 'open',
        created_at: '2020-05-26T09:42:56Z',
    });
}

export default () => {
    const [editableKeys, setEditableRowKeys] = useState([]);
    const [dataSource, setDataSource] = useState(defaultData);
    const [position, setPosition] = useState('top');
    const [newRecord, setNewRecord] = useState({
        id: (Math.random() * 1000000).toFixed(0),
        decs: '随便'
    });

    

    const columns = [
        {
            title: '活动名称',
            dataIndex: 'title',
            formItemProps: {
                rules: [
                    {
                        required: true,
                        message: '此项为必填项',
                    },
                ],
            },
            // 第二行不允许编辑
            editable: (text, record, index) => {
                return index !== 1;
            },
            width: '30%',
        },
        {
            title: '状态',
            key: 'state',
            dataIndex: 'state',
            valueType: 'select',
            valueEnum: {
                all: { text: '全部', status: 'Default' },
                open: {
                    text: '未解决',
                    status: 'Error',
                },
                closed: {
                    text: '已解决',
                    status: 'Success',
                },
            },
        },
        {
            title: '描述',
            dataIndex: 'decs',
            fieldProps: (from, { rowKey }) => {
                if (from.getFieldValue([rowKey || '', 'title']) === '不好玩') {
                    return {
                        disabled: true,
                    };
                }
                return {};
            },
        },
        {
            title: '操作',
            valueType: 'option',
            width: 200,
            render: (text, record, _, action) => [
                <a key="editable" onClick={() => {
                    console.log('=====action', action);
                    var _a;
                    (_a = action.startEditable) === null || _a === void 0 ? void 0 : _a.call(action, record.id);
                }}>
                    编辑
          </a>,
            ],
        },
    ];







    const add = () => {
        return {
            id: (Math.random() * 1000000).toFixed(0),
            decs: '随便'
        }

    }



    const dataArr = record => {

        const newData = [...dataSource];
        const index = newData.findIndex(item => record.id === item.id);
        if (index > -1) {//编辑时候
            const item = newData[index];
            newData.splice(index, 1, { ...item, ...record });
            setDataSource(newData);
        }else{
            if (record.title == '222') {
                newData.push(record);
                setDataSource(newData);
            }else{
                setDataSource(newData);
            }
        }  

    }




    return (<div>
        <EditableProTable rowKey="id" headerTitle="可编辑表格" 
            recordCreatorProps={{
            position,
            record: add()
            }}
            columns={columns}
            request={(params, sort, filter) => {
                return {
                    data: dataSource,
                    //total: defaultData.length,//这里会默认写死表格总数据,不建议在request限定
                    success: true,
                }
            }}
            pagination={{
                showSizeChanger: true,
                showQuickJumper: true,
                position: ["bottomCenter"],
                size: 'small',
                defaultPageSize: 10
            }}
            value={dataSource}
            editable={{
                editableKeys,
                onSave: async (k, r) => {
                    dataArr(r)
                },
                onChange: setEditableRowKeys,
            }} />
    </div>);
};

实现效果
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Ant Design Pro 提供了一个可编辑表格的组件,名为 EditableTable,可以轻松地实现表格数据的编辑和保存。下面是一个简单的例子: ```jsx import { useState } from 'react'; import { Button, Table, Input } from 'antd'; const EditableTable = () => { const [data, setData] = useState([ { id: 1, name: 'John', age: 24 }, { id: 2, name: 'Mary', age: 32 }, { id: 3, name: 'Bob', age: 45 }, ]); const handleSave = (row) => { const newData = [...data]; const index = newData.findIndex((item) => row.id === item.id); newData[index] = row; setData(newData); }; const columns = [ { title: 'Name', dataIndex: 'name', editable: true, }, { title: 'Age', dataIndex: 'age', editable: true, }, { title: 'Action', render: (_, row) => ( <Button type="primary" onClick={() => handleSave(row)}> Save </Button> ), }, ]; const components = { body: { row: EditableRow, cell: EditableCell, }, }; const EditableRow = ({ index, ...restProps }) => ( <Table.Row {...restProps} /> ); const EditableCell = ({ title, editable, children, dataIndex, record, handleSave, ...restProps }) => { const [editing, setEditing] = useState(false); const [inputValue, setInputValue] = useState(children); const toggleEdit = () => { setEditing(!editing); setInputValue(record[dataIndex]); }; const handleChange = (event) => { setInputValue(event.target.value); }; const handleBlur = () => { setEditing(false); handleSave({ ...record, [dataIndex]: inputValue }); }; return ( <td {...restProps}> {editable ? ( editing ? ( <Input value={inputValue} onChange={handleChange} onBlur={handleBlur} /> ) : ( <div style={{ paddingRight: 24 }} onClick={toggleEdit}> {children} </div> ) ) : ( children )} </td> ); }; return ( <Table bordered dataSource={data} columns={columns} components={components} rowKey="id" /> ); }; export default EditableTable; ``` 注意,这个例子中使用了 antd 的 Input 和 Button 组件,如果没有安装 antd,需要先安装才能运。另外,这个例子还使用了 React Hooks 实现了组件的状态管理。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值