antd table 添加行,编辑行,删除行
目标
- 添加行:点击添加行,当有行在编辑并未进行保存时提示先保存;表格行中未有未保存的内容时,表格最后加一行,并可以输入内容,当点击取消时,整行删除不保存。
- 删除行:所在行删除
- 保存行:保存所在行
详细代码
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 添加行,编辑行,删除行相关推荐
- Antd Table 可编辑表格
antd Table 官方文档提及了 可编辑单元格.可编辑行,这里解决 可编辑表格 主要思路是将 antd Table 可编辑行 与 antd Form.List 相结合,将Table视为 Form. ...
- antd Table 实现 表格行固定
需求: antd Table 只有 列固定 和表头固定,但是 我的需求是 行固定 前 三行固定. 实现步骤 方式一.表格固定行(rowClassName 实现) 思路是 :用position: sti ...
- Antd Table 点击行变换背景颜色 (Antd React)
需求 实现的目标是,点击这一行,然后出现一个modal,这个modal可以拖拽,并且可以知道是点击哪一行出现的事件. 那么需要做的就是,点击这一行,然后其背景颜色变化. 实现 Antd Table有 ...
- AntD 可编辑行表格
本地数据代码模板自用,官网例子改改 // 编辑行的自定义表格 import React, { useState } from "react"; import {Table,Inpu ...
- element-ui可编辑行增加行或删除行
<template><div><div style="margin-bottom: 20px"><el-button @click=&qu ...
- antd table合并行或者列(动态添加合并行、列)
antd table合并行或者列(动态添加合并行.列) 表头只支持列合并,使用 column 里的 colSpan 进行设置. 表格支持行/列合并,使用 render 里的单元格属性 colSpan ...
- layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列
layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列 类似效果 上下左右键实现的代码 layui.config({base: '/static/layuia ...
- React使用antd Table生成层级多选组件
一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...
- 在word中用vba为选中区域自动添加行号或删除行号
需求说明 用word编辑文档时,希望快速为选中内容添加行号或删除行号.如果手动来做,当行数很多时,就会比较麻烦,这时VBA就可以派上用场. vba源码 '为选中内容添加行号Sub 添加行号()n = ...
最新文章
- ubuntu 开启关闭mysql 服务
- pythonimport是拷贝_02Python学习笔记之二.一【import、==和is、深浅拷贝】2019-08-17
- Linux 命令之 file 命令-识别文件类型
- python中classmethod与staticmethod的差异及应用
- 什么是API文档?--斯科特·马文
- 放肆的使用UIBezierPath和CAShapeLayer画各种图形
- HashTable HashMap区分
- 教你win7关闭开机动画,大幅度加快开机时间
- 计算机专业职业规划范文800字,计算机专业学生职业生涯规划书
- FPGA LVDS液晶屏
- 读吴军博士新浪微博(2012.09-2014.12)信息整理
- 吴海燕C语言真题,基于APP的智能婴儿床系统的设计与实现开题报告
- FMI人工智能与大数据线下沙龙第869期北京场圆满落幕
- TCP通信 、 UDP通信
- 恢复出厂设置 LED灯闪烁
- modern cmake的概念剖析
- 银行支付接口测试怎么执行
- html转换docx,word(doc,docx)转换为HTML
- 计算机房等电位连接,机房防静电地板等电位接地方案
- 【北京-望京】这些互联网公司值得你加入
热门文章
- 深度学习+符号表征=强大的多任务通用表征,DeepMind新论文可能开启AI新时代
- C++课后作业 3. 教材习题4_8:定义Dog类,包含age和weight信息
- 无线路由器连接电信光猫实现拨号上网方法
- 待办日程用什么软件好 2022好用的便签记事日程管理软件推荐
- 《the Great Gatsby》Day 33
- 二、LaTeX学习笔记——基本结构、设置表格、文字变形及符号、插入图片
- SAP-ME mobile开发基础
- 自定义Android聊天气泡ChatView。仿微信聊天气泡,能自定义边框,颜色,点击特效。
- python笔记一:海龟画图
- 具有检查点的恢复技术