ant design 中实现表格头部可删除和添加
我是用antd pro做一个项目。有一个小需求是表格头部栏可操作。具体是表头的每一项都带一个“x”按钮,当不想展示这一栏的时候,直接点“x”,这一栏就不展示了。不展示的头部标签放一边,也可以随时加入到表格中。
先看图:
1.表头信息有个“x”,当点击了某一项,该项在表格中消失,并且该标签会在可添加表头上展示。
2.此时我“x”掉了序号,用户名两项,得到下面的效果。
3.此时我点击了 “+用户名” 标签,表格中再次展示了用户名,同时,可添加表头栏少了 “+用户名” 标签。
这项功能在ant design 上的表格组件是没有的,所以我自己在现有组件的基础上实现的。如果你想看懂下面的代码,你需要了解ant design 的表格组件的使用。
import React from 'react';
import { connect } from 'dva';
import GridContent from '@/components/PageHeaderWrapper/GridContent';
import {
Table,
Card,
Form,
Input,
Button,
Tag,
Select,
Row,
Col,
DatePicker,
message,
Tooltip,
Icon,
} from 'antd';
import { ABNORMAL_AUDIT_STATUS, ABNORMAL_AUDIT_STATUS_COLOR } from '@/constants';
import moment from 'moment'; const { Option } = Select;
const { RangePicker } = DatePicker; const FormItem = Form.Item;
const risk = ['无', '低', '中', '高', '严重'];
@connect(({ riskEvent, abnormalList, loading }) => ({
riskEvent,
abnormalList,
loading: loading.models.abnormalList,
}))
@Form.create()
class AbnormalList extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedData: [],
newCol: [],
colKey: {
id: 0,
username: 1,
riskLevel: 2,
riskScene: 3,
department: 4,
createTime: 5,
status: 6,
baseInfo: 7,
operatePlatform: 8,
},
columns: [
{
title: (
<div>
<a onClick={() => this.columsControl('id')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
序号
</div>
),
dataIndex: 'id',
key: '序号',
},
{
title: (
<div>
<a onClick={() => this.columsControl('username')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
用户名
</div>
),
dataIndex: 'username',
key: '用户名',
},
{
title: (
<div>
<a onClick={() => this.columsControl('riskLevel')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
风险等级
</div>
),
dataIndex: 'riskLevel',
key: '风险等级',
sorter: true,
sortDirections: ['descend'],
render: text => risk[text],
},
{
title: (
<div>
<a onClick={() => this.columsControl('riskScene')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
风险场景
</div>
),
dataIndex: 'riskScene',
key: '风险场景',
render: riskScene => {
const isLong = riskScene.length > 10;
return (
<span>
{isLong ? (
<Tooltip title={riskScene}>`${riskScene.slice(0, 10)}...`</Tooltip>
) : (
<span>{riskScene}</span>
)}
</span>
);
},
},
{
title: (
<div>
<a onClick={() => this.columsControl('department')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
部门
</div>
),
dataIndex: 'department',
key: '部门',
render: dep => {
const isLong = dep.length > 10;
return (
<span>
{isLong ? (
<Tooltip title={dep}>`${dep.slice(0, 10)}...`</Tooltip>
) : (
<span>{dep}</span>
)}
</span>
);
},
},
{
title: (
<div>
<a onClick={() => this.columsControl('createTime')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
告警时间
</div>
),
dataIndex: 'createTime',
key: '告警时间',
},
{
title: (
<div>
<a onClick={() => this.columsControl('status')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>{' '}
状态
</div>
),
dataIndex: 'status',
key: '状态',
render: status => (
<Tag color={ABNORMAL_AUDIT_STATUS_COLOR[status]}>{ABNORMAL_AUDIT_STATUS[status]}</Tag>
),
},
{
title: (
<div>
<a onClick={() => this.columsControl('baseInfo')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>
文件名
</div>
),
dataIndex: 'baseInfo',
key: '文件名',
render: text => {
const jsonData = JSON.parse(text);
const name = jsonData.filename;
return name ? <span>{name}</span> : '';
},
},
{
title: (
<div>
<a onClick={() => this.columsControl('operatePlatform')}>
<Icon style={{ fontSize: '6px' }} type="close" />
</a>
操作平台
</div>
),
dataIndex: 'operatePlatform',
key: '操作平台',
},
{
title: '操作',
fixed: 'right',
width: 80,
render: (_, record) => (
<div>
{record.status === 0 ? (
<RoamMoudle onOk={this.pushRoma}>
<a
onClick={() => {
this.roamId(record.id);
}}
>
流转
</a>
</RoamMoudle>
) : (
<span>流转</span>
)}
</div>
),
},
],
};
} componentWillMount() {
const { dispatch } = this.props;
dispatch({
type: 'abnormalList/fetchList',
payload: {
page: 1,
pageSize: 10,
filter: [],
},
});
} columsControl = str => {
const { colKey, columns, newCol } = this.state;
const id = colKey[str];
newCol.push(columns[id]);
delete columns[id]; // 此处用delete方便后续添加某项表头的时候能回到最开始的位置
this.setState({ columns, newCol });
}; addCol = (one, str, i) => {
const { colKey, columns, newCol } = this.state;
const id = colKey[str];
columns.splice(id, 1, one); // 替换
newCol.splice(i, 1); // 删除
this.setState({ columns, newCol });
}; handleTableChange = (pagination, filters, sorter) => {
const { current, pageSize } = pagination;
const {
dispatch,
abnormalList: { filter },
} = this.props;
dispatch({
type: 'abnormalList/fetchList',
payload: {
page: current,
pageSize,
filter,
sorter,
},
});
}; render() {
const { abnormalList, loading } = this.props;
const { selectedData, columns, newCol } = this.state; const { data, page, total } = abnormalList; const rowSelection = {
onChange: (selectedRowKeys, selectedRows) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
this.setState({ selectedData: selectedRowKeys });
},
getCheckboxProps: record => ({
disabled: record.name === 'Disabled User', // Column configuration not to be checked
name: record.name,
}),
}; return (
<GridContent>
<Card bordered={false}>
<div
style={{
border: '1px solid #CAE7FD',
padding: '5px 10px',
borderRadius: '4px',
background: '#E9F7FE',
}}
>
可添加表头:
{newCol.map((item, index) => (
<Tag key={item.dataIndex}>
<a
onClick={() => {
this.addCol(item, item.dataIndex, index);
}}
>
+{item.key}
</a>
</Tag>
))}
</div>
<br />
<Table
columns={columns}
dataSource={data}
loading={loading}
rowSelection={rowSelection}
scroll={{ x: 1300 }}
rowKey="id"
pagination={{
showSizeChanger: true,
current: page,
total,
pageSizeOptions: ['10', '20', '50', '100'],
}}
onChange={this.handleTableChange}
/>
</Card>
</GridContent>
);
}
} export default AbnormalList;
主要是在columns 中的title中添加点击事件。columsControl,addCol两个函数是实现的关键。
转载请说明来源,谢谢
ant design 中实现表格头部可删除和添加的更多相关文章
- Ant Design中根据用户交互展示不同的标签
Ant Design中根据用户交互展示不同的标签 Ant Design使用的是React框架,那么我们先看代码: <Fragment> <a onClick={() => th ...
- Ant Design中getFieldDecorator方法的特殊用法(小bug)
记录Ant Design中getFieldDecorator方法的特殊的一个用法 了解Ant Design表单的小伙伴都知道,getFieldDecorator在大部分情况下是用来绑定一个控件的,即像 ...
- 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%
如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ...
- Word2010中的页眉怎样删除和添加横线
http://jingyan.baidu.com/article/f79b7cb3bb3c629144023e05.html 我们在使用Word2010编辑文档中时,有时需要在页眉下方删除或添加一条横 ...
- React之ant design的table表格序号连续自增
render(text,record,index){ return( <span>{(pagination.current-1)*10+index+1}</spa ...
- ant design 中的 Select 组件常规写法
1.代码 import { Select, Spin } from 'antd'; const Option = Select.Option; <Select allowClear showSe ...
- Ant Design中的Form组件
1. 使用Form.create()包裹过的组件可以获取到this.props.form属性 Form.create()(Comp) 2. getFieldDecorator() // 在表单中的使用 ...
- js实现表格信息的删除和添加
制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点击删除按钮 ...
- Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
转自:http://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对 ...
随机推荐
- 微信支付回调 敏感信息解密 v3 php
今天博主用了一波微信的v3版本的支付,支付成功后发现回调跟v2的完全不一样,于是去看了了一波v3的文档,发现信息是经过加密的,需要解密才能获取的到 但是最悲催的是文档上没写怎么解密的,经过了一下午的百 ...
- FL Studio采样设置之时间拉伸栏
今天小编将带领大家了解一下FL Studio采样设置页面中的时间拉伸栏知识,该栏目包含了和采样音频的时间拉伸相关的设置.其右边是一个时间伸缩方式下拉列表,里面列出了很多种类的伸缩方式,自动方式是默认的 ...
- 在Mac上也能轻松拥有Windows应用程序的简便方法
一般而言,如果我们想要在Windows的环境下下载一款软件那是件很方便的事情.只要我们登陆软件的官网进行下载即可.但是如果我们使用的是Mac OS系统,很多用户就会发现,许多软件会出现不兼容的情况. ...
- 下载器Folx专业版有没有iTunes整合功能
对于使用Mac系统的用户来说,相信对iTunes都不陌生.Folx专业版提供的iTunes整合功能,能将下载的音频.电影等文件自动同步到iTunes. 该功能将会有助于用户的音频.视频整合,对于喜欢听 ...
- Java里的数组降序
Java升序容易,降序不易. 基本类型不能降序,至少要是包装类. 升序使用Arrays.sort() 降序要么使用Collections.reverse,要么实现Comparator接口 import ...
- 可变长形参,增强for语句
`package 可变长形参; public class VarArgumen { public static int max(int...varArgs) {//就有可变长形参的求最大值方法 //可 ...
- framework中的sentinel
引入切面: 切面+sentinel-web-servlet private void initDataSource() { String zkUrl = zaSentinelConfig.getDat ...
- limit+orderBy陷阱
碰到一个奇怪的bug,在排序的时候对一个非唯一的字段做order by, 结果在分页的时候,发现每一页的数据都是乱的,并不是对整个排序之后再去limit的. 当我们用唯一字段去排序的时候,因为在找到满 ...
- 「刷题笔记」DP优化-状压-EX
棋盘 需要注意的几点: 题面编号都是从0开始的,所以第1行实际指的是中间那行 对\(2^{32}\)取模,其实就是\(unsigned\ int\),直接自然溢出啥事没有 棋子攻击范围不会旋转 首先, ...
- 我与PHP,ULM和Vue.js不得不说的故事(我与PHP白月光的那些事儿之第三年的见异思迁番外篇)
关于PHP的认知 -----恍惚间眸眼像极了一位故人 第一年遇见,那时的它还稚嫩懵懂.像白纸一样的脸,极容易读懂.于是放荡不羁,不放真心.稍微用心,它便能高兴好久.初识它时它叫C语言,浅尝却不觉其难过 ...