Antd Pro V4 protable详解(ps:踩坑日记)

写在前面:
在这篇文章中,你会了解到:

  • protable 中的cloumns属性详解
  • protable数据加载和处理(两种方法,直接使用service或者使用models)
  • 一些笔者踩过的小坑
  • 在将model与Protable结合时的疑问
一、ProTable概要

1.为什么需要ProTable?
antd pro 中的大部分组件来自于 antd , 而 antd pro table 则是基于 antd 的 table 组件再封装了一层, 熟练使用 antd pro table, 能够覆盖大部分增删改查业务的需要, 关键是只需要极少的配置, 就能得到一个完善的表格。引用官方的话来说,那就是

antd 作为服务于企业级产品的设计体系的组件库,已经提供了强大的 Table,但是业务的不同导致我们仍有需要进行一些定制,不同的单元格有很多不同的数据格式,金额,日期,数字等,包括一些常用的操作,页码切换时的重新请求,刷新数据等,这些都是很简单的重复劳动,但是却不可避免。

ProTable 就是为了解决这些问题,在 Table 的层面上提供了一些预设,你可以通过 valueType 来支持各种类型的数据,预设了金额,日期,序号,进度条 等多种类型,并且支持通过 valueEnum 来映射枚举,解决非常烦人的各种枚举配置,可以大大的简化代码。

综上,一言以蔽之,ProTable is fucking awesome!(But还是有一些小问题需要解决。)

2.ProTable的主要板块

在大部分场景中,我们只需要配置这四种颜色的板块即可:

  • 红色:search属性,搜索表单,传入对象时为搜索表单的配置,设置是否显示,默认为true
  • 绿色:通过,toolBarRender进行配置,渲染工具栏,支持返回一个 dom 数组,会自动增加 margin-right
  • 蓝色:通过rowSelection(已经选择项),tableAlertRender(当前共选中 1 项,共有 1 项未解决),tableAlertOptionRender(自定义 清空)三个属性进行配置
  • 棕色:通过columns进行配置,也就是表头。
<ProTablecolumns={columns}request={async (params = {}) =>   //请求数据request('https://proapi.azurewebsites.net/github/issues', {params,})}rowKey="id"rowSelection={{}}tableAlertRender={({ selectedRowKeys, selectedRows }) =>`当前共选中 ${selectedRowKeys.length} 项,共有 ${selectedRows.reduce((pre, item) => {if (item.state === 'open') {return pre + 1;}console.log(selectedRowKeys,selectedRows)return pre;}, 0)} 项未解决 `}tableAlertOptionRender={props => {const { onCleanSelected } = props;return (<Space><a>自定义</a><a onClick={onCleanSelected}>清空</a></Space>);}}dateFormatter="string"headerTitle="批量操作"toolBarRender={(_, { selectedRowKeys }) => [   //配置绿色框中的内容<Button key="3" type="primary"><PlusOutlined />新建</Button>,selectedRowKeys && selectedRowKeys.length && (<Buttonkey="3"onClick={() => {window.alert(selectedRowKeys.join('-'));}}>批量删除</Button>),]}/>
二、ProTable详解

1.cloumns
以下笔者把一些需要尝试才能试出来的属性标注,其余一看文档就懂的属性,笔者就不赘述了

const columns = [{title: '序号',  // 对应表头的文字dataIndex: 'index',  //对应你的字段名称valueType: 'indexBorder',  //indexBorder就是proTable自动帮你生成的1,2,3,4的序号width: 72,    //通过width属性, 可以自行调节这一栏的宽度,不过总宽度不要超过100%哦},{title: '标题',dataIndex: 'title',copyable: true,    //多出来一个蓝色的复制icon,点击就直接进行复制ellipsis: true,   //用...代替没有显示的文本,并且在鼠标移到相应的文本上会显示全部的相应文本tip: '标题过长会自动收缩',   //显示在表头作为一个提示width: '30%',hideInSearch: true,   //在最上面的搜索栏不显示该字段},{title: '状态',dataIndex: 'state',initialValue: 'all',filters: true,valueEnum: {all: {  //key表示选中该状态后,所获得的值text: '全部',  //text表示实际显示出来的文本status: 'Default',  //表示文字前面的那一个点是什么颜色},open: {text: '未解决',status: 'Error',  //表示文字前面的那一个点是什么颜色 :红色},closed: {text: '已解决',status: 'Success', //表示文字前面的那一个点是什么颜色 :绿色},processing: {text: '解决中',status: 'Processing',},},width: '10%',},{title: '标签',dataIndex: 'labels',width: '10%',render: (_, row) => (  //自定义渲染方法,返回一个ReactNode,row就是这一整行的数据<Space>{row.labels.map(({ name, id, color }) => (<Tag color={color} key={id}>{name}</Tag>))}</Space>),},{title: '创建时间',key: 'since',dataIndex: 'created_at',valueType: 'dateTime',width: '20%',},{title: '操作',valueType: 'option',render: (text, row, _, action) => [  //自定义渲染方法,返回一个ReactNode,row就是这一整行的数据<a href={row.html_url} target="_blank" rel="noopener noreferrer" key="link">链路</a>,<a href={row.html_url} target="_blank" rel="noopener noreferrer" key="warning">报警</a>,<a href={row.html_url} target="_blank" rel="noopener noreferrer" key="view">查看</a>,<TableDropdownkey="actionGroup"onSelect={() => action.reload()} // action 是Form.useForm暴露出来的对象,便于手动触发表格操作menus={[{key: 'copy',name: '复制',},{key: 'delete',name: '删除',},]}/>,],},
];

2.数据加载:跳过models,直接使用service进行API管理

首先是页面初始化的时候,通过request属性加载相应的数据,request属性,携带当前页数(current)和页面数据量(pageSize)两个变量,但是在改变当前页数,都会再次触发request发起请求。

index.jsx

import {getData,changeData} from './service'
....省略<ProTable...省略request = {async (params)=>{let data = Object.assign(params,...把其它需要的参数,绑定到params)let res = await getData(data)return {data:data ,success:truetotal:data.total}}}/>

service.js
小tips,request中,如果key为params会将参数拼接在地址后面,而data,则是会将参数放在请求体中,并且PUT,DELETE方法也是使用data属性

import request from '@/utils/request'export async function getData(params){return request('/api/test',{params:params})
}export async function changeData(params){return request('/api/test',{data:params,methods:"POST"})
}

返回数据格式的坑:

大家要注意的一点是,request属性对于返回的数据格式是有要求的

request={async (params = {}) =>{console.log("params",params)return {data: dataSource,total: tableListDataSource.length,success: true,pageSize,current: parseInt(`${params.currentPage}`, 10) || 1,}}}

特别是前三个data,total,success字段,如果没有的话,页面是没有数据的,刚开始用pro的时候,笔者在这里踩过坑, 标注一下!

ps:如果用户在进入页面的时候不需要自动触发request请求数据,需要用户手动查询之后,才会获取到数据,只需要添加一个。manualRequest = {true}属性即可,但注意,添加这个属性之后,最上方的serach就是不可隐藏的了。

3.数据更新,调用action

/*** 添加节点* @param fields*/const handleAdd = async fields => {   //添加数据const hide = message.loading('正在添加');try {await addRule({ ...fields });  //调用相应的service中的api即可hide();message.success('添加成功');actionRef.current.reload()   //刷新表格,触发request属性拉取最新数据} catch (error) {hide();message.error('添加失败请重试!');}
};

其它action操作

// 刷新
ref.current.reload();
// 加载更多
ref.current.fetchMore();
// 重置到默认值
ref.current.reset();
// 清空选中项
ref.current.clearSelected();

ps:这里只是对于是否成功发起请求进行了判断,但是如果要进行错误处理的话,目前根据umi-request官方的说法,最多只能在model中的effect或者reducer中进行处理,无法直接在umi-request使用中间件或者用其它方法在源头处理,umi-request即使请求失败,依旧会把失败的相应返回给用户。

4.疑问:将model与ProTable结合
这是问题示范,笔者还没有实践成果过,大家注意
(1)写service

import request from '@/utils/request'export async function getData(params){return request('https://proapi.azurewebsites.net/github/issues',{params:params}) //此处笔者直接使用官方提供的api作为测试api
}

(2)写model

import {getData,changeData} from './service'const TestModel = {namespace:"TestModel",state:{testData:[]},effects:{*fetchTestData({payload},{put,call}){const response = yield call(getData,payload)  //调用apiyield put({  //触发saveData这个reducertype:"saveData",payload:response})}   },reducers:{saveData(state,action){return {...state,testData:action.payload || {}}  //将获取到的数据合并到state中}}
}export default TestModel

(3)将dispatch和state连接到组件上

import {connect} from 'dva'
export default connect(({TestModel})=>({  //TestModel是相应的namespacetestData:TestModel.testData
}))(Test)

(4)将dispatch写入request属性中,并且将testData赋给dataSource属性(用来初始化table)

<ProTable。。。省略request = {(params)=>{dispatch({type:"TestModel/fetchTestData",payload:params})}}dataSource={testData}/>

这样即使数据格式正确,pro仍然无法正确显示数据,一脸懵逼。。。。


以上就是关于Protable的全部内容
详情请查阅官方文档:ProComponents

感谢阅读,欢迎批评指正,希望大家能够在追求卓越中不断进步,让优秀成为一种习惯~

Antd Pro V4 protable详解(ps:踩坑日记)相关推荐

  1. YOLOv5在无人机/遥感场景下做旋转目标检测时进行的适应性改建详解(踩坑记录)...

    作者丨略略略@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/358441134 编辑丨极市平台 文章开头直接放上我自己的项目代码: https://github.co ...

  2. 【超详细附参考】阿里云部署spring项目基本流程详解及踩坑经验

    文章目录 环境及前期准备 基本流程 购买云服务器 连接云服务器 工具准备 Xshell连接: Xftp连接: 环境配置 JDK安装 Tomcat安装 Mysql安装 Maven安装 项目打包部署 数据 ...

  3. 树莓派3b+安装ubuntu 16.04+ROS kinetic过程详解及踩坑总结

    本人手上有一块树莓派3b+和一个32G内存卡. 想着在上面安装一个ubuntu系统学习ros用. 硬件准备清单: 1.树莓派 2.SD卡及读卡器. 3.屏幕和hdmi连接线. 4.键盘鼠标. 然后了解 ...

  4. 2013款Mac Pro“神秘”主机详解

    2013款Mac Pro"神秘"主机详解 自2013年12月下旬新款Mac Pro在美国发布以来,经过一个月的等待终于在国内已到货,笔者亲自测试了这个号称"神秘" ...

  5. Antd Pro V4 样式修改大全(有图有真相)

    Antd Pro V4 样式修改大全 一.左侧菜单的logo和标题 (1)logo修改 BasicLayout.jsx import logo from '../assets/example.jpg' ...

  6. Antd Pro v4入门

    Antd Pro v4入门 什么是Ant Design Pro Ant Design Pro 是一个企业级中后台前端/设计解决方案,我们秉承 Ant Design 的设计价值观,致力于在设计规范和基础 ...

  7. sklearn评估指标Classification metrics常用指标详解及小坑

    sklearn评估指标Classification metrics常用指标详解及小坑 计算评估指标需要用到预测结果和真实标签,首先说一下获得预测结果的model.predict()和model.pre ...

  8. Win11 + Ubuntu18.04 双系统踩坑日记

    Win11 + Ubuntu18.04 双系统踩坑日记 前言 准备工作 硬件配置 镜像下载 Win11镜像下载 Ubuntu镜像下载 启动盘准备 Win11启动盘 Ubuntu启动盘 Win11安装 ...

  9. 全志哪吒D1-H Tina Linux Ubuntu 22.04入门踩坑日记

    哪吒D1-H Tina Linux入门踩坑日记 系统环境 源码编译 mklibs-readelf的C++标准问题 m4的SIGSTKSZ问题 libfakeroot的_STAT_VER问题 read_ ...

最新文章

  1. 市场营销学python有用吗_1、熟悉Python编辑、开发和运行环境。
  2. 极速理解设计模式系列【目录索引】
  3. 祖传人像玩家,如何把AI秀出新高度
  4. Python操作Oracle数据库:cx_Oracle
  5. java ubuntu 14.04,ubuntu14.04下安装JAVA
  6. MySQL 使用 LOAD DATA 导入 csv 文件
  7. xListView的使用步骤
  8. [导入]C#优化字符串操作【月儿原创】
  9. pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...
  10. 基坑监测日报模板_刚刚!温州瓯海突发塌陷,初步判断为临近地块地下室基坑支护桩移位...
  11. python gevent缺点_python 协程 greenlet gevent
  12. python 二维矩阵及转byte知识点
  13. unity 线程断点时卡机_Java使用JDI进行线上程序断点信息记录
  14. 正则表达式在python中的应用_正则表达式:Python3中的应用简介
  15. 【转】WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍
  16. UNI-APP_uni-app中设置radio和switch的大小
  17. 读书笔记《区块链原理与技术 郑子彬》——区块链共识层
  18. Java版KTV预定管理系统源码
  19. pvid与access的关系_关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系
  20. 更改oracle监听默认端口

热门文章

  1. javaScript实现简易计算器:在输入数字,选择需要的运算,点击等号即可出现结果(效果图+代码)
  2. 14.OracleRAC打补丁执行:./datapatch -verbose 夯死
  3. 【置顶】【PAT】PAT甲级题目及分类总结(持续更新ing)
  4. 嵌入式开发之Qt-5.9.6应用程序开发环境搭建
  5. HDU 5514 Collision(扩展欧几里得+解方程)——2014ACM/ICPC亚洲区北京站
  6. c++ 中operater delete和operater new重载
  7. 安装环境,软件,部署靶场,sql靶场等任务
  8. NPDP值不值得去学习?
  9. Spring Boot 实践折腾记(11):使用 Spring 5的WebFlux快速构建效响应式REST API
  10. 构建中国云生态 | 华云数据与开江科技完成产品兼容互认证 携手赋能政务数字化建设