React+Hook+ts+antDesign实现table行编辑功能

前言

大家好 我是歌谣 今天要说的是ant design实现表格行编辑的功能 考虑问题的时候我们需要多看官方的api

开发开始

紧接着我们对照着api进行开发 首先加一个table

```

total: menuData?.page.dataTotal,
                        showTotal: () => {
                            return '共 ' + menuData?.page.dataTotal + ' 条记录';
                        },
                    }}
                    columns={columns as ColumnTypes}
                    rowSelection={rowSelection}

                />

```

对component进行定义

const components = { body: { row: EditableRow, cell: EditableCell, }, };

对 EditableRow进行定义

参照官网api引入对应的依赖

``` const EditableContext = React.createContext | null>(null);

const EditableRow: React.FC = ({ index, ...props }) => { const [form] = Form.useForm(); return (

); }; ```

对EditableCell进行定义

``` const EditableCell: React.FC = ({ title, editable, children, dataIndex, record, handleSave, ...restProps }) => { const [editing, setEditing] = useState(false); const inputRef = useRef (null); const form = useContext(EditableContext)!;

useEffect(() => {
    if (editing) {
        inputRef.current!.focus();
    }
}, [editing]);

const toggleEdit = () => {
    setEditing(!editing);
    form.setFieldsValue({ [dataIndex]: record[dataIndex] });
};


const save = async () => {
    try {
        const values = await form.validateFields();
        toggleEdit();
        handleSave({ ...record, ...values });
    } catch (errInfo) {
        console.log('Save failed:', errInfo);
    }
};

let childNode = children;

if (editable) {
    childNode = editing ? (
        <Form.Item
            style={{ margin: 0 }}
            name={dataIndex}
            rules={[
                {
                    required: true,
                    message: `${title}不能为空`,
                },
            ]}
        >

            <Input ref={inputRef} onPressEnter={save} onBlur={save} />
        </Form.Item>
    ) : (
        <div className="editable-cell-value-wrap" style={{ paddingRight: 24 }} onClick={toggleEdit}>
            {children}
        </div>
    );
}

return <td {...restProps}>{childNode}</td>;

}; ```

handleSave进行定义

const handleSave = (row: any) => { // console.log(batchUpdateSizeList) batchUpdateSizeList([{ id: row.id, size: row.sizeName }]) .unwrap() .then((response: any) => { if (response.code === 200) { message.success("操作成功") } }); const newData: any = [...menuData.list]; const index = newData.findIndex((item: any) => row?.id == item.id); const item = newData[index]; newData.splice(index, 1, { ...item, ...row, }); setMenuData({ list: newData, page: { dataTotal: menuData.page.dataTotal, size: menuData.page.size, } }); };

handleSave中的数据是核心 利用当前行数据的回调可以处理数据和接口 完成当前行的更新

对表头column的设置

const columns = defaultColumns.map(col => { if (!col.editable) { return col; } return { ...col, onCell: (record: any) => ({ record, editable: col.editable, dataIndex: col.dataIndex, title: col.title, handleSave, }), }; });

对默认column的设置

以上是对column函数数据处理的讲解 接下来设置defaultColumn数据的设置 对可以操作的属性editable变为true即可

``` const defaultColumns: (ColumnTypes[number] & { editable?: boolean; dataIndex: string })[] = [ { title: '颜色', dataIndex: 'colorName', editable: false,

},
    {
        title: '尺码',
        dataIndex: 'sizeName',
        editable: true,

    },
    {
        title: '扎号',
        dataIndex: 'lotCode',
        editable: false,
    },

    {
        title: '床号',
        dataIndex: 'bedCode',
        editable: false,

    },
    {
        title: '床次',
        dataIndex: 'bedSeq',
        editable: false,

    },
    {
        title: '每扎数量',
        dataIndex: 'lotCount',
        editable: false,

    },
    {
        title: '缸号',
        dataIndex: 'batchCode',
        editable: false,

    },
    {
        title: '裁片名称',
        dataIndex: 'cuttingName',
        editable: false,

    },
    {
        title: '结果',
        dataIndex: 'result',
        editable: false,

    },
    {
        title: '操作',
        dataIndex: 'operation',
        render: (_, record: any) =>

            <a onClick={() => handlePrintData(_, record)}>打印</a>

    },
];

```

结果展示

在这里插入图片描述

双击即可进行编辑操作 这个问题相对还是非常简单的 对照官网的案例进行修改即可 我是歌谣 微信公众号前端小歌谣 谢谢你的一键三联

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值