如果你刚开始学习前端或者 React,将 UI 框架作为你的第一步可能不是最好的主意。 (这是引用antd官网的一句话),虽然说一开始用antd作为UI框架对新手来说并不是很好,但是如果工作需要呢,那就不得不这样做了。

下面我就挑两个常用而且对新手稍微有点难度组件来进行讲解,分别是table 表格和 Cascader级联选择。

antd -> Table 树形数据展示

效果如下:

第一步:打开链接,完成安装和初始化引入antd两个步骤;

第二步:把src里面的文件全部删除,然后分别创建 App.jsdata.jsindex.js

index.js 代码如下:

import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/lib/button/style';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
复制代码

data.js 是我封装的数据,代码如下:

export default class Model {static get(){const datas=[{id:'01',name:"第一级01",children:[{id:'001',name:"第二级01",children:[{id:'0001',name:'第三级01'},{id:'0002',name:'第三级02'}]},{id:'002',name:'第二级02',}]},{id:'02',name:'第一级02',},]return datas;}
}复制代码

App.js 开始使用Table进行实操啦,代码如下:

import React, { Component } from 'react';
import Model from './data'
import {Table} from 'antd';
import 'antd/dist/antd.css';
const columns = [{title: '编码',dataIndex: 'id',}, {title: '名称',dataIndex: 'name',}];
export default class App extends Component{state={tableData:[],  //表格数据}componentDidMount () {// 获取数据树this.handleDataTree();}handleDataTree=()=>{// 获取data.js里面的数据const da = Model.get();if(da && da.length>0){this.handleGetChild(da);this.setState({tableData:da,})}}handleGetChild = (data) =>{for(let x = 0,le =data.length; x<le;x +=1){data[x] = {...data[x],key:data[x].id,code:data[x].id,name:data[x].name,}if (data[x].children && data[x].children.length > 0) {this.handleGetChild(data[x])}}}render(){return(<div><Table columns={columns} dataSource={this.state.tableData} pagination={false} //不展示分页器,如果需要删除该行代码即可rowKey={recode => recode.id}  //表格行的key/></div>)}
}
复制代码

注意: 1.Table里面带的参数可以看官网的API。

​ 2.如果只想展示到某一级的话就只需要在调用this.handleGetChild(da,index);的时候传递一个数据(就是代码里的index),然后再

 if (data[x].children && data[x].children.length > 0) {this.handleGetChild(data[x],index+1)}
复制代码

​ 这段代码里面加上一个index+ 1 最后在写一个if语句判断一下就可以。

细讲 :函数handleDataTree() 在获取到数据后判断,如果数据的长度大于1那么就会先执行handleGetChild()然后再把数据传递给this.state.tableData。至于这里为什么要调用函数来处理数据而不是直接处理数据的原因是:

如果数据只有一两层那还好,直接写就是了,但是如果数据有N层了呢,那就很复杂了,所以采用``````handleGetChild() ```把数据传过去然后解析,如果这条数据里面的chilidren还有值的话,就再调用一下这个函数。这样无论数据有多少层就都可以轻松展示了。

antd-Cascader 级联选择(把平级数据改为树形)

除了App.jsdata.js 这两个页面的代码跟上面的不一样,其他的操作都是一样的,我们先来看下效果:

data.js 代码如下:

export default class Model {static get(){const datas=[{id:'01',name:'第一层01',parentId:'0'},{id:'001',name:'第二层001',parentId:'01'},{id:'002',name:'第二层002',parentId:'01'},{id:'0010',name:'第三层0010',parentId:'001'},{id:'0020',name:'第三层0020',parentId:'002'},{id:'0021',name:'第三层0021',parentId:'002'},]return datas;}
}复制代码

App.js 代码如下:

import React, { Component } from 'react';
import Model from './data'
import {Cascader} from 'antd';
import 'antd/dist/antd.css';
export default class App extends Component{state={cascaderData:[],  //数据}onChange=(value)=> {console.log(value);}componentDidMount () {// 获取数据树this.handleDataTree();}handleDataTree=()=>{// 获取data.js里面的数据const da = Model.get();if(da && da.length>0){let dataMap = {};da.forEach((item)=>{dataMap[item.id]={key:item.id,value:item.id,label:item.name,parentId:item.parentId}})let root={};for(const key in dataMap){if(key){const {parentId} = dataMap[key];if(parentId === '0'){root = dataMap[key]}else if(dataMap[parentId]){if(!dataMap[parentId].children){dataMap[parentId].children=[]}dataMap[parentId].children.push(dataMap[key])}}}this.setState({cascaderData:[root]})}}render(){return(<div><Cascader options={this.state.cascaderData} onChange={this.onChange} placeholder="Please select" /></div>)}
}
复制代码

这里需要注意的是如果想要完成改代码就需要找到子元素的某个数据 = 父元素的某个数据,只有找到这个原理才能完成这个效果。

这里的const {parentId} = dataMap[key];是把dataMap[key]里的parentId解构出来。

react - antd (Table 与 Cascader 平级数据转树形实操)相关推荐

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

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

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

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

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

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

  4. react antd Table 表格 td超出自动换行

    1.问题: 目前有打印需求遇到了点问题,打印时表头太长导致出现横向滚动条,而借助于 react-to-print只能打印出视图区可见内容,所以打印的时候滚动条里面的内容没打印到. 现在为了完整打印页面 ...

  5. 前端扁平化数据转树形数据_把平级数据变成树形数据

    为了记住这个方法:转化数据 [ {element:'图片',id:'1',pid:'0'},//count=1 {element:'大图片',id:'2',pid:'1'}, {element:'pn ...

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

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

  7. react antd 更改table 表头和表行样式

    我这里以组件的形式来提供code 使实例正确运行至少需要以下知识: 1 创建react项目(本实例基于react项目) 2 知道如何导入和调用组件 样式效果如下图: 实现方法 目录结构: YMColl ...

  8. React基于antd Table实现可拖拽调整列宽的表格

    实现功能 1:表格列宽初始自动分配.列宽总和不能超过容器宽度(无横向滚动条,公司项目特殊需求) 2:当容器宽度变化时,保持当前列宽的分配比例,等比缩小 3:拖动过程中不进行列宽的调整,只有释放之后再进 ...

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

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

最新文章

  1. android Adapter剖析理解
  2. 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
  3. 转载/VMware Workstation环境下的Linux网络设置/适用于无线网络
  4. 安装Putty远程终端连接工具
  5. 2016蓝桥杯省赛---java---A---10(压缩转换)
  6. Xiki Shell Kickstarter,HummingBoard计算机等
  7. 用StreamReader读取服务器端文本文件,或远程网页
  8. 系统架构----(2)大型网站架构之架构模式
  9. 7.UNIX 环境高级编程--进程环境
  10. C语言函数调用之数组与指针
  11. 单双面打印价格一样吗_正式合同应该打印单面还是双面?
  12. html圆角输入框内放大镜,如何用CSS制作一个圆形放大镜
  13. java 页眉页脚_Java 添加Word页眉、页脚
  14. Android 7.0以上安装fiddler CA证书失败解决方法
  15. 【BZOJ2813】奇妙的Fibonacci(结论,线性筛)
  16. 【数理知识】Lipschitz 条件 Lipschitz 常数
  17. 微信语音能保存多久服务器,微信语音播放失败?可能是这几个原因导致的,看完你就懂了...
  18. qq邮箱android版官方,QQ邮箱下载_腾讯QQ邮箱客户端下载【安卓版】-太平洋下载中心...
  19. EtherCAT主站SOEM函数详解---- ecx_readstate、ecx_writestate
  20. 智慧教室解决方案-最新全套文件

热门文章

  1. tomcat 端口_【Java】指定端口运行 war 包
  2. oshi.systeminfo 获取cpu的数量_CPU 的基础知识
  3. mysql in 原理_深入理解MySql子查询IN的执行和优化
  4. ubuntu idea桌面快捷方式无法启动_每个 Ubuntu 用户都应该知道的键盘快捷键
  5. ecplice中class.forname一直报错_Python怎么把文件内容读取出来,怎么把内容写入文件中
  6. ThreadPoolExecutor线程池的理解与应用
  7. 卷积神经网络只是一种全连接神经网络的特殊情况
  8. php刷新公测,2021新时代来临,Z-BlogPHP 1.7 重磅公测
  9. python strip函数用法_python strip()函数 介绍
  10. Linux无法打开sda硬盘,linux – 无法挂载’/ dev / sda’