前言:

最近在做一个权限管理的后台项目,经常涉及到树形数据展示,就用到了antd,table表格树形数据组件。记录一下使用过程的坑。

环境及配置:

antd -3.23.6(大版本为antd 3)  官方antd 3版本API文档

antd 3和antd 4版本对于表格来说变动很小只是把展开配置放到了一个expandable的对象里,所以只需要稍微变动就可以运用到antd v4版本

antd Table树形数据展示及使用

使用很简单只需要数据是树形结构的就可以(一般都是children为标志,如果不是可以使用childrenColumnName树形指定key名,api文档里写的很清楚)。

1.自定义展开收起图标:

业务要求需要自定义展开收起(默认的不太好看)

实现思路:

利用 expandIcon,判断是否可以展开来实现

import React, { Component } from 'react';
import { Table, Divider, Tag,Icon } from 'antd';
const data=[{name:"破阵",age:"32",tel:"5555",leve:1,children:[{name:"山鬼谣",age:"18",tel:"55554",leve:2,children:[{name:"弋痕夕",age:"34",tel:"55554",leve:3,}]},{name:"天净沙",age:"45",tel:"555549",leve:2,}]},{name:"辗迟",age:"18",tel:"5555",leve:1,children:[]}
];
const coumns=[{title: 'name',dataIndex: 'name',key: 'name',render: text => <a>{text}</a>,},{title: 'age',dataIndex: 'age',key: 'age',render: text => <a>{text}</a>,},{title: 'tel',dataIndex: 'tel',key: 'tel',render: text => <a>{text}</a>,},
];
class index extends Component {render() {return (<div><Table dataSource={data} columns={coumns} expandIcon={({expanded, onExpand, record})=>{ //expanded-是否可展开, onExpand-展开事件默认, record-每一项的值 设置自定义图标if(expanded){//根据是否可以展开判断return  <Icon type="minus-circle" onClick={e => onExpand(record, e)}/>}else{return  <Icon type="plus-circle" onClick={e => onExpand(record, e)}/>}}}/></div>);}
}export default index;

2.业务要求默认展开

要知道antd里只要和default沾边的都只是初次渲染管用(比如给input设置默认值等等),所以官方给的是expandedRowKeys和onExpand结合实现。

实现思路:

expandedRowKeys和onExpand结合实现。判断是否展开,动态改变expandedRowKeys。

注意数据里的key必须是唯一的,否则会出现展开一个另一个也跟着展开(当然如果需求就是联动可以相同)。

先加上expandedRowKeys默认是展开了,但是会出现点击展开和折叠就不生效了,所以要结合onExpand实现(使用这个默认的就不生效了,默认没有子项是不展示图标的,所以还要加一个判断)

class index extends Component {state = {expandedRowKeys: []}componentDidMount() {let keyArr = [];data.map((item, index) => { //这里就可以把要展开的key加进来记住必须是唯一的keyArr.push(item.key)})this.setState({expandedRowKeys: keyArr})}onExpand = (expanded, record) => { //expanded是否展开  record每一项的值let { expandedRowKeys } = this.state;if (expanded) {let arr = expandedRowKeys;arr.push(record.key);this.setState({expandedRowKeys: arr})} else {let arr2 = [];if (expandedRowKeys.length > 0 && record.key) {arr2 = expandedRowKeys.filter((key) => {return key !== record.key;})}this.setState({expandedRowKeys: arr2})}}render() {return (<div><Table dataSource={data} columns={coumns}expandIcon={({ expanded, onExpand, record }) => { //expanded-是否可展开, onExpand-展开事件默认, record-每一项的值 设置自定义图标if (record.children&&record.children.length != 0) {//有子项加才有图标(根据自己的额业务需求变动)if (expanded) {//根据是否可以展开判断  return <Icon type="minus-circle" onClick={e => onExpand(record, e)} />} else {return <Icon type="plus-circle" onClick={e => onExpand(record, e)} />}} else {return ''}}}expandedRowKeys={this.state.expandedRowKeys}onExpand={this.onExpand}/></div>);}
}

3.给不同层级加颜色(类似于隔行变色)

实现思路:根据level来判断层级利用rowClassName来动态该改变类名

class index extends Component {state = {expandedRowKeys: []}componentDidMount() {let keyArr = [];data.map((item, index) => { //这里就可以把要展开的key加进来记住必须是唯一的keyArr.push(item.key)})this.setState({expandedRowKeys: keyArr})}onExpand = (expanded, record) => { //expanded是否展开  record每一项的值let { expandedRowKeys } = this.state;if (expanded) {let arr = expandedRowKeys;arr.push(record.key);this.setState({expandedRowKeys: arr})} else {let arr2 = [];if (expandedRowKeys.length > 0 && record.key) {arr2 = expandedRowKeys.filter((key) => {return key !== record.key;})}this.setState({expandedRowKeys: arr2})}}classNameFn=(record, index)=>{let className="";if(record){if(record.leve==1){className="leve1"}else if(record.leve==2){className="leve2"}else if(record.leve==3){className="leve3"}else{className=""}}console.log(className)return className;}render() {return (<div><Table dataSource={data} columns={coumns}expandIcon={({ expanded, onExpand, record }) => { //expanded-是否可展开, onExpand-展开事件默认, record-每一项的值 设置自定义图标if (record.children&&record.children.length != 0) {if (expanded) {//根据是否可以展开判断  return <Icon type="minus-circle" onClick={e => onExpand(record, e)} />} else {return <Icon type="plus-circle" onClick={e => onExpand(record, e)} />}} else {return ''}}}expandedRowKeys={this.state.expandedRowKeys} //展开行onExpand={this.onExpand} //展开事件rowClassName={this.classNameFn} //表格行类名/></div>);}
}
@import '~antd/es/style/themes/default.less';
.leve1{background: burlywood;
}
.leve2{background: blue;
}
.leve3{background: gray;
}

4.给表格设置样式

给表格设置样式需要元素审查一级一级的找

利用:':global'来覆盖就行

总结:

antd是很好的开源UI库,但也存在很多问题。需要根据自己的业务来,选择适合的组件。另外antd-pro是一个不错的框架(dva+umi),可以快速开发应用。

本文参考资料来自:antd API官方文档   antd-pro API 文档

react-antd table树形数据默认展开行实现以及自定义图标实现及踩坑(defaultExpandedRowKeys,expandedRowKeys)相关推荐

  1. el-table树形数据全部展开和收缩(toggleRowExpansion)

    本文主要讲根据element-ui文档的toggleRowExpansion实现el-table树形数据全部展开和收缩 1.页面效果 2.HTML页面展示 树形数据:直接使用element-ui的de ...

  2. antd 表格树如何展开_ant-design-pro protable 树形表格默认展开

    Protable 是在antd 的 table 上进行了一层封装,antd -table中有的属性它都支持. 当表格数据中有children字段,table会默认生成树形可展开表格,有时候需要一开始就 ...

  3. Antd Table树形展示,分页后有时候数据渲染不出的问题

    项目场景: Antd V4版 网页端 问题描述: 使用Table树形 使用Card onTabChange 切换tab,有时候数据渲染不出的问题 const paginationProps = {Cu ...

  4. antd table表的全部展开

    antd table组件,在项目中,出场相当频繁,样式也繁多 Now,要说的时table的展开功能 table属性 defaultExpandAllRows :初始时,是否展开所有行.以为是个王者属性 ...

  5. 自定义antd table子表格的展开和收起,一键展开收起

    效果: 代码: import React from 'react'; import {Table} from 'antd'; const key = []; // 定义一个空的数组. export d ...

  6. React antd table使用react-resizable实现伸缩列

    首先声明注意点: 1.设置列宽的width一定要用number类型.(如果不使用number类型,会出现第一次点击时卡顿的情况) 2.less中需要设置类的样式,如果无效,可以尝试加上:global( ...

  7. Android之ExpandableListView的各种效果(默认展开不合闭,自定义父栏目及箭头控制)

    1. 设置ExpandableListView 默认是展开的:  先实例化exListView (ExpandableListView所有数据齐全后可用,否则报错) exListView.setAda ...

  8. react antd Table 选中某一行,其它行也被选中了

    问题描述: 使用react_antd_design 中的Table组件,渲染的结果如下: 但是现在出现的问题是当我选中其中的一行,其他的行也变成了选中的状态,无法实现选中单行 这当然不是我们想要的结果 ...

  9. React antd Table 实现单元格点击 表头斜线分组等功能

    先上成品示意图: 几个关键步骤: 一 定义数据结构: export const data = [{key: 'row1',beforeUpdateLevel: '等级1',level_1: '保',l ...

最新文章

  1. keepalived 高可用日志说明及实战配置日志路径
  2. STM32f1的中断系统
  3. python3 分割字符串(多分割符)
  4. java 中window_教你如何在windows上安装Java
  5. 增强学习--蒙特卡洛方法
  6. (转)基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder...
  7. leetcode题解108-将有序数组转换为二叉排序树
  8. ASP.NET刷新页面的六种方法(转) 包括在跳转的时候使用提示
  9. Unity 3D下载安装教程
  10. java心得体会2000字_java的学习心得体会
  11. vdbench安装及使用
  12. 解读升压电路(BOOST)与降压电路(BUCK)
  13. 机械盘阵高并发——使用ImDisk 与 junction显著提高整体吞吐性能
  14. 字符转 ASCII 码
  15. 如何快速8小时写一篇毕业论文
  16. Git遇到Unable to create 'E:/xxx/.git/index.lock': File exists.的解决办法
  17. python转换迅雷地址为http地址
  18. 向日葵 11.0.0.34335 中文版 (老牌国产远程控制软件)
  19. 深度学习入门 (九):卷积层和池化层的实现
  20. 国家职业标准职业编码查询_如何以自由职业者的身份学习编码和赚钱

热门文章

  1. 逻辑回归和决策树_结合逻辑回归和决策树
  2. Spring Boot Redis 实现分布式锁,真香,你掌握了多少?
  3. K8s系列之:DNS服务搭建指南
  4. cmake + googletest 之一 入门
  5. SpringBoot企业微信点餐系统
  6. python 小括号转译_Python-HTML转义字符
  7. 条码支付互联互通介绍
  8. 第11期 DApp 榜单:这是一篇让DD君重伤住院的内容
  9. 十二星座物语,女生最喜欢的星座性格【1】
  10. PS填充颜色边缘模糊