React使用antd实现可编辑单元格

2023-11-02

import React, { useContext, useState, useEffect, useRef } from 'react';
import { Input, Form, } from 'antd';
import Table from '@com/Table';
import 'antd/dist/antd.css';
import '../styles/search.less';
// 
import '../styles/edittables.less'

/**
 * 只适用于 单个单元格修改
 * 必传字段 :
 *       columns:[],
 *       dataSource:[]
 * 必传方法
 *      saveFun  用于改变input输入值之后触发的回调函数
 */

const EditableContext = React.createContext(null);

const EditableRow = ({ index, ...props }) => {
    const [form] = Form.useForm();
    return (
        <Form form={form} component={false}>
            <EditableContext.Provider value={form}>
                <tr {...props} />
            </EditableContext.Provider>
        </Form>
    );
};

const EditableCell = ({
    title,
    editable,
    children,
    dataIndex,
    record,
    saveFun,
    ...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();
            // 返回当前行信息  包括更改后的信息
            saveFun({ ...record, ...values })
        } catch (errInfo) {
            console.log('Save failed:', errInfo);
        }
    };

    let childNode = children;
	//判断是否可编辑
    if (editable) {
        childNode = editing ? (
            <Form.Item
                style={{
                    margin: 0,
                    lineHeight: "27px"
                }}
                name={dataIndex}
                rules={[
                    {
                        required: true,
                        message: `${title} is required.`,
                    },
                ]}
            >
                <Input ref={inputRef} style={{ height: "22px", borderRadius: "4px" }} onPressEnter={save} onBlur={save} />
            </Form.Item>
        ) : (
                <div
                    className="editable-cell-value-wrap"
                    style={{
                        paddingRight: 24,
                    }}
                    onClick={toggleEdit}
                >
                    {children}
                </div>
            );
    }

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

class EditableTable extends React.Component {
    static defaultProps = {
        columns: [],
        dataSource: []
    }
    render() {
        const { dataSource,columns,saveFun, ...rest } = this.props;
        // 每一行 每一个单元格 
        const components = {
            body: {
                row: EditableRow,
                cell: EditableCell,
            },
        };
        const newColumns = columns.map((col) => {
            if (!col.editable) {
                return col;
            }
            return {
                ...col,
                onCell: (record) => ({
                    record,
                    editable: col.editable,
                    dataIndex: col.dataIndex,
                    title: col.title,
                    saveFun: saveFun
                }),
            };
        });
        return (
            <div>
                <Table
                    {...rest}
                    components={components}
                    rowClassName={() => 'editable-row'}
                    dataSource={dataSource}
                    columns={newColumns}
                />
            </div>
        );
    }
}

export default EditableTable

使用:

<EditTable
     bordered={false}
     size={'default'}
     columns={columns} //表格的列
     dataSource={dataTable} //表格渲染的数据
     title={tableName} //表格的名字
     pagination={false}
     saveFun={this.saveFun}
/>

columns:

 columns: [
                {
                    title: () => '序号(可编辑)',
                    dataIndex: 'priority',
                    width: '10%',
                    key: 'priority',
                    editable: true,
                },
                {
                    title: () => 'xx',
                    dataIndex: 'generate',
                    key: 'generate'
                },
                {
                    title: () => 'xx',
                    dataIndex: 'ttl',
                    key: 'ttl'
                },
                {
                    title: () => 'xx',
                    dataIndex: 'type',
                    key: 'type'
                },
                {
                    title: () => 'xx',
                    dataIndex: 'value',
                    key: 'value'
                },
                ]

editable属性为true的时候表示当前单元格可编辑;saveFun为该单元格离开焦点或者回车之后出发的回调函数。

saveFun:

saveFun=(item)=>{
      // item为当前行 的所有属性
    }

参考antd官方可编辑单元格:https://ant.design/components/table-cn/#components-table-demo-edit-cell

其实上边98%的代码都是固定写法,ctrl C V 即可实现…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React使用antd实现可编辑单元格 的相关文章

随机推荐

  • QT5.12编译MQTT 5.13图文详细版

    看到很多小伙伴都在用mqtt 在此记录下 1 下载最新的MQTT源码 https github com emqx qmqtt git 2 使用Qt qcreator打开 qtmqtt qtmqtt pro工程文件 或者使用步骤9终极杀招只需
  • 零基础 SQL 数据库小白,从入门到精通的学习路线与书单

    一 学SQL的苦恼 我观察了 865 个 SQL 入门者 发现大家在学习 SQL 的时候 最大的问题不是 SQL 语法 而是对 SQL 原理的不熟悉 很多初学者 往往被 SQL 能做什么 为什么会有 SQL 这门语言给迷惑到了 他们用学英语
  • java 纯面向对象_Java是纯粹的面向对象语言吗?

    码农公社 210 net cn 210 1024 10月24日一个重要的节日 码农 程序员 节 纯面向对象语言支持或具有将程序内的所有内容视为对象的功能 不支持原始数据类型 如 int char float bool 等 什么是纯面向对象语
  • vue3中使用vue3-seamless-scroll(最新版本滚动插件)

    vue3中使用vue3 seamless scroll 最新版本滚动插件 Vue3 0 无缝滚动组件 支持Vite2 0 支持服务端打包 官方git地址 npm安装 npm install vue3 seamless scroll save
  • BERT,Transformer的模型架构与详解

    BERT Transformer的模型架构与详解 1 1 认识BERT 学习目标 了解什么是BERT 掌握BERT的架构 掌握BERT的预训练任务 什么是BERT BERT是2018年10月由Google AI研究院提出的一种预训练模型 B
  • 强制卸载symantec

    在网上找了一堆的文章 都没有解决我的问题 最后Google了一把 还是利用symantec自己出的工具 CleanWipe zip 把它卸载了 正所谓解铃还需系铃人啊 太无耻了 分割线 要下载一个工具CleanWipe zip来卸载 然后打
  • GDAL源码剖析(二)之编译说明

    转载自 http blog csdn net liminlu0314 article details 6937194 一 简单的编译 1 使用VisualStudio IDE编译 首先进入GDAL的源代码目录 可以看到有几个sln为后缀的文
  • vue可以用ajax,Vue 中使用Ajax请求

    Vue 项目中常用的 2 个 ajax 库 一 vue resource vue 插件 非官方库 vue1 x 使用广泛 vue resource 的使用 下载 npm install vue resource save 编码 引入模块 注
  • 『学Vue2+Vue3』声明式导航

    day06 一 声明式导航 导航链接 1 需求 实现导航高亮效果 如果使用a标签进行跳转的话 需要给当前跳转的导航加样式 同时要移除上一个a标签的样式 太麻烦 2 解决方案 vue router 提供了一个全局组件 router link
  • ES6使用递归实现深拷贝

    使用递归实现深拷贝 let deepCopy function obj 判断拷贝的要进行深拷贝的是数组还是对象 是数组的话进行数组拷贝 对象的话进行对象拷贝 let newObj obj instanceof Array if obj ty
  • 安卓小游戏:俄罗斯方块

    安卓小游戏 俄罗斯方块 前言 最近用安卓自定义view写了下飞机大战 贪吃蛇 小板弹球三个游戏 还是比较简单的 这几天又把俄罗斯方块还原了一下 写了一天 又摸鱼调试了两天 逻辑不是很难 但是要理清 处理对还是有点东西的 需求 这里的需求玩过
  • python导入包失败ModuleNotFoundError: No module named 'matplotlib.pyplot'; 'matplotlib' is not a package

    最近在看 python 在使用matplotlib进行绘图时 提示 ModuleNotFoundError No module named matplotlib pyplot matplotlib is not a package 怎么回事
  • pytorch9-微调VGG16网络(基于kaggle数据集识别10种猴)

    import hiddenlayer as hl import torch import torch nn as nn from torch optim import SGD Adam import torch utils data as
  • 使用auth_request做权限控制

    网上很多如标题的文章 为何我还要写呢 网上一搜一大堆对我来说完全没用的文章 或者直接nginx官网复制过来 看得我贼无语 我的需求是校验参数是拼接到链接后面 而不是请求头的 网上大部分都是通过请求头来获取校验参数 开启auth reques
  • postman测试websocket接口(带鉴权)

    postman测试websocket接口 带鉴权 文章目录 postman测试websocket接口 带鉴权 1 前言 2 无用户鉴权情况下 3 有用户鉴权的情况下 4 最后 1 前言 目前开发实时日志推送 确认了两个方案 一个是通过tra
  • windows和linux下的c语言/网络/网络编程面试题收集[更新:2006.6.8]

    以下试题和答案均由 明天去要饭 从网上收集 仅供参考 如果发现错误或有更好的答案请回复 本人将对答案进行更新 基础部份 1 下列程序在32位linux或unix中的结果是什么 func char str printf d sizeof st
  • IDEA的DEBUG

    先认识一下DEBUG面板 先讲讲右侧的几个功能 12 Show Execution Point Alt F10 跳转到程序正在执行的地方 当浏览其他地方的代码后忘记程序执行到哪了或找起来麻烦时相当实用 13 Step Over F8 下一步
  • 多个组件的生命周期执行顺序

    多个组件的生命周期顺序 1 单个组件生命周期执行顺序 从官方文档上我们可以看出单个组件的生命周期顺序 beforeCreate created beforeMount mounted 2 多个组件的生命周期顺序 1 父组件与子组件 验证步骤
  • Linux中在Eclipse中远行tomcat失败

    Could not load the Tomcat server configuration 现象 启动tomcat时提示 Could not load the Tomcat server configuration at Servers
  • React使用antd实现可编辑单元格

    import React useContext useState useEffect useRef from react import Input Form from antd import Table from com Table imp