目标

  • 添加行:点击添加行,当有行在编辑并未进行保存时提示先保存;表格行中未有未保存的内容时,表格最后加一行,并可以输入内容,当点击取消时,整行删除不保存。
  • 删除行:所在行删除
  • 保存行:保存所在行

详细代码

index.js

import React from 'react';
import EditableFormTable from './EditableFormTable';export default class HelloAdmin extends React.Component {constructor(props) {super(props);this.state = {};}componentDidMount() {}render() {return <EditableFormTable />;}
}

TableData.js

const data = [];
for (let i = 0; i < 6; i += 1) {data.push({key: i.toString(),name: `Edrward ${i}`,age: 32,address: `London Park no. ${i}`,});
}
export const Tabledata = data;

TableContext.js

import React from 'react';export const EditableContext = React.createContext();

EditableFormTable.js

import React from 'react';
import { Popconfirm, Form, Table, Button, message } from 'antd';
import PropTypes from 'prop-types';
import { Tabledata } from './TableData';
import { EditableContext } from './TableContext';
import EditableCell from './EditableCell';class EditableTable extends React.Component {constructor(props) {super(props);this.state = {data: Tabledata,editingKey: '',};this.columns = [{title: 'name',dataIndex: 'name',width: '25%',editable: true,},{title: 'age',dataIndex: 'age',width: '15%',editable: true,},{title: 'address',dataIndex: 'address',width: '40%',editable: true,},{title: 'operation',dataIndex: 'operation',render: (text, record) => {const { editingKey } = this.state;const editable = this.isEditing(record);return editable ? (<span><EditableContext.Consumer>{(form) => (<buttononClick={() => this.save(form, record.key)}style={{ marginRight: 8 }}type="button">Save</button>)}</EditableContext.Consumer><Popconfirmtitle="Sure to cancel?"onConfirm={() => this.cancel(record.key)}><button style={{ marginRight: 8 }} type="button">Cancel</button></Popconfirm><Popconfirmtitle="Sure to delete?"onConfirm={() => this.delete(record.key)}><button type="button">delete</button></Popconfirm></span>) : (<buttontype="button"disabled={editingKey !== ''}onClick={() => this.edit(record.key)}>Edit</button>);},},];}isEditing = (record) => {const { editingKey } = this.state;return record.key === editingKey;};cancel = (key) => {if (key.length > 6) {const { data } = this.state;const newData = data;newData.splice(data.length - 1, 1);this.setState({ data: newData, editingKey: key });}this.setState({ editingKey: '' });};delete = (key) => {const { data } = this.state;const newData = data;const index = newData.findIndex((item) => key === item.key);newData.splice(index, 1);this.setState({ data: newData, editingKey: '' });};save(form, key) {form.validateFields((error, row) => {if (error) {return;}const { data } = this.state;const newData = [...data];const index = newData.findIndex((item) => key === item.key);if (index > -1) {const item = newData[index];newData.splice(index, 1, {...item,...row,});this.setState({ data: newData, editingKey: '' });} else {newData.push(row);this.setState({ data: newData, editingKey: '' });}});}edit = (key) => {this.setState({ editingKey: key });};handleAdd = () => {const { data, editingKey } = this.state;if (editingKey !== '') {message.error('请先保存');return;}const key = new Date().toString();const row = {key,name: '',age: '',address: '',};console.log(data);console.log(row);const newData = data;newData.splice(data.length, 1, row);this.setState({ data: newData, editingKey: key });console.log(newData);};render() {const components = {body: {cell: EditableCell,},};const columns = this.columns.map((col) => {if (!col.editable) {return col;}return {...col,onCell: (record) => ({record,inputType: col.dataIndex === 'age' ? 'number' : 'text',dataIndex: col.dataIndex,title: col.title,editing: this.isEditing(record),}),};});const { data } = this.state;const { form } = this.props;return (<EditableContext.Provider value={form}><Button onClick={this.handleAdd} type="primary" style={{ marginBottom: 16 }}>Add a row</Button><Tablecomponents={components}bordereddataSource={data}columns={columns}rowClassName="editable-row"pagination={{onChange: this.cancel,}}/></EditableContext.Provider>);}
}const EditableFormTable = Form.create()(EditableTable);
export default EditableFormTable;EditableTable.propTypes = {form: PropTypes.object,
};

EditableCell.js

import React from 'react';
import { Input, InputNumber, Form } from 'antd';
import { EditableContext } from './TableContext';const FormItem = Form.Item;class EditableCell extends React.Component {getInput = () => {const { inputType } = this.props;if (inputType === 'number') {return <InputNumber />;}return <Input />;};renderCell = ({ getFieldDecorator }) => {const {editing,dataIndex,title,inputType,record,index,children,...restProps} = this.props;return (<td {...restProps}>{editing ? (<FormItem style={{ margin: 0 }}>{getFieldDecorator(dataIndex, {rules: [{required: true,message: `Please Input ${title}!`,},],initialValue: record[dataIndex],})(this.getInput())}</FormItem>) : (children)}</td>);};render() {return <EditableContext.Consumer>{this.renderCell}</EditableContext.Consumer>;}
}export default EditableCell;

转载于:https://my.oschina.net/u/3913691/blog/3061791

antd table 添加行,编辑行,删除行相关推荐

  1. Antd Table 可编辑表格

    antd Table 官方文档提及了 可编辑单元格.可编辑行,这里解决 可编辑表格 主要思路是将 antd Table 可编辑行 与 antd Form.List 相结合,将Table视为 Form. ...

  2. antd Table 实现 表格行固定

    需求: antd Table 只有 列固定 和表头固定,但是 我的需求是 行固定 前 三行固定. 实现步骤 方式一.表格固定行(rowClassName 实现) 思路是 :用position: sti ...

  3. Antd Table 点击行变换背景颜色 (Antd React)

    需求 实现的目标是,点击这一行,然后出现一个modal,这个modal可以拖拽,并且可以知道是点击哪一行出现的事件. 那么需要做的就是,点击这一行,然后其背景颜色变化. 实现 Antd Table有 ...

  4. AntD 可编辑行表格

    本地数据代码模板自用,官网例子改改 // 编辑行的自定义表格 import React, { useState } from "react"; import {Table,Inpu ...

  5. element-ui可编辑行增加行或删除行

    <template><div><div style="margin-bottom: 20px"><el-button @click=&qu ...

  6. antd table合并行或者列(动态添加合并行、列)

    antd table合并行或者列(动态添加合并行.列) 表头只支持列合并,使用 column 里的 colSpan 进行设置. 表格支持行/列合并,使用 render 里的单元格属性 colSpan ...

  7. layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列

    layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列 类似效果 上下左右键实现的代码 layui.config({base: '/static/layuia ...

  8. React使用antd Table生成层级多选组件

    一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...

  9. 在word中用vba为选中区域自动添加行号或删除行号

    需求说明 用word编辑文档时,希望快速为选中内容添加行号或删除行号.如果手动来做,当行数很多时,就会比较麻烦,这时VBA就可以派上用场. vba源码 '为选中内容添加行号Sub 添加行号()n = ...

最新文章

  1. ubuntu 开启关闭mysql 服务
  2. pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17
  3. Linux 命令之 file 命令-识别文件类型
  4. python中classmethod与staticmethod的差异及应用
  5. 什么是API文档?--斯科特·马文
  6. 放肆的使用UIBezierPath和CAShapeLayer画各种图形
  7. HashTable HashMap区分
  8. 教你win7关闭开机动画,大幅度加快开机时间
  9. 计算机专业职业规划范文800字,计算机专业学生职业生涯规划书
  10. FPGA LVDS液晶屏
  11. 读吴军博士新浪微博(2012.09-2014.12)信息整理
  12. 吴海燕C语言真题,基于APP的智能婴儿床系统的设计与实现开题报告
  13. FMI人工智能与大数据线下沙龙第869期北京场圆满落幕
  14. TCP通信 、 UDP通信
  15. 恢复出厂设置 LED灯闪烁
  16. modern cmake的概念剖析
  17. 银行支付接口测试怎么执行
  18. html转换docx,word(doc,docx)转换为HTML
  19. 计算机房等电位连接,机房防静电地板等电位接地方案
  20. 【北京-望京】这些互联网公司值得你加入

热门文章

  1. 深度学习+符号表征=强大的多任务通用表征,DeepMind新论文可能开启AI新时代
  2. C++课后作业 3. 教材习题4_8:定义Dog类,包含age和weight信息
  3. 无线路由器连接电信光猫实现拨号上网方法
  4. 待办日程用什么软件好 2022好用的便签记事日程管理软件推荐
  5. 《the Great Gatsby》Day 33
  6. 二、LaTeX学习笔记——基本结构、设置表格、文字变形及符号、插入图片
  7. SAP-ME mobile开发基础
  8. 自定义Android聊天气泡ChatView。仿微信聊天气泡,能自定义边框,颜色,点击特效。
  9. python笔记一:海龟画图
  10. 具有检查点的恢复技术