antd新增一行页码不正确_antd-Table@4.x对rowKey属性的重构
时间:2020/04/26 ,转载请注明出处。
写在前面
antd团队于2020年2月发布了酝酿已久的antd@4.0版本,对样式的调整、部分组件逻辑的重构都进行了较大改动,本文针对Table的rowKey属性重构作分析。
由一个mistake带来的思考
在数据治理模块的表格中使用了Table点击表格行进而选中该行的功能¹(非checkbox,点此查看官方demo),升级4.0后发现被选中表格行的className缺少了 ant-table-row-selected,导致交互效果失效。因为升级前后代码未作变动却出现问题,antd官方也并未声明该部分的改动,反复排查也没有找到问题所在。
后来意识到因为rowKey属性具有默认值"key",在不做显式设置的情况下,组件对此无感知,antd未做声明可能是因为该功能不会显式地对组件的使用产生影响,而此处出错的原因是我将rowKey错误地显式设置成"id"(dataSource中record的唯一主键是"key",与"id"不一致,导致错误)。有意思的是v3.x竟然没报错,并且可以正常使用。基于此疑惑与不解,我去翻看了源码,探究rowKey属性值究竟会否以及如何影响样式的变化。
在源码的对比中发现问题所在
借助VSCode的gitlens扩展²,快速定位到了Table@4.x中对rowKey属性的changelog。
发现antd对Table进行了大量样式上的改写,其中在PR(#19678)³中新增加了一个用于修改 rowClassName 的新方法 internalRowClassName ⁴。
在这个方法中,通过 getRowKey 获取正确的rowKey值,为选中行添加类名 ant-table-row-selected 从而实现选中行的底色效果。而 getRowKey 方法通过Table的rowKey属性值(默认为"key")去获取record["key"]的值,从而返回正确的key值⁵。所以当rowKey属性不显式设置或设置为正确的值(record的唯一主键)时,getRowKey方法可以返回正确的值,从而为row添加类名。但如果rowKey设置错误,则 getRowKey 返回undefined,那么 internalRowClassName 方法无法为row添加 ant-table-row-selected 类名。
由此看到,4.0版本中要求rowKey属性必须传入正确的值。那么为什么*rowKey传入错误的值在3.x版本中却没有报错呢?*
带着疑问,我将antd切到了branch@3.x-stable分支中再次查看getRowKey方法,发现 3.x中 getRecordKey 的返回值并不会受 rowKey 被错误设置的影响,它永远可以返回一个正确可用的key值⁶,因此不会出现上述问题。
真相大白。
如此一来,antd@3.x中rowKey属性的值实质上并不会对组件的使用产生报错性的影响(但会抛出warning),这也就解释了开篇中该mistake的问题所在。4.x对rowKey属性的改写以及rowClassName方法的新增,优化了Table组件的正确合理使用。antd将该PR定性为重构(Refactoring)⁷。
antd新增一行页码不正确_antd-Table@4.x对rowKey属性的重构相关推荐
- Html5-如何正确给table加边框
Html5-如何正确给table加边框 分析单个属性的效果 一.表格边框 border="1" 二.cellspacing单元格间距 三.cellpadding单元格边距 四.去掉 ...
- kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)
目标:layui 实现点击按钮添加一行 解决方案: 方案1.table 是用转换静态表格的方式创建的,写一个button,每次点击按钮,就添加一个 标签: 方案2.table 是用方法渲染的方式创建的 ...
- layui当前表格第一行_layui数据表格新增一行
方案一 layui的数据表格集成了查看编辑删除等功能,但新增功能官方文档却没有提及,当业务需求需要点击新增一行时,可用如下方式实现 实现的思路是:当点击新增一行时,把之前的数据保存下来,并在数据尾部增 ...
- handsontable mysql_Handsontable 新增一行 默认值
效果图: aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVYAAACOCAIAAADl17ciAAALCklEQVR4nO2d0XmrvBJFXZQ7o ...
- vi vim 快速跳到文件末尾 GA 在最后一行下方新增一行 (光标换行,文字不换行) GO
vim 快速跳到文件末尾 在最后一行下方新增一行 移到末尾,并且进入文本录入模式 GA 在一般模式(刚进入的模式,esc模式) 先 G 或 shift+g 到最后一行 然后 A 或 shift+a 到 ...
- Html-浅谈如何正确给table加边框
Html-浅谈如何正确给table加边框 一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式. 1 <style>2 table,table tr th, ta ...
- Html:正确给table表格加边框
目录 方式一:属性方式 方式二:css方式(推荐) 表格代码 <table><thead><tr><th>序号</th><th> ...
- 使用NG-ZORRO(Angular 组件库)中Table组件,通过columnTable属性固定列,结果每行数据内容穿透了两遍的固定列;鼠标滑过该条数据时,两侧固定列的背景色不跟着改变~
[问题] 使用NG-ZORRO(Angular 组件库)中Table组件,通过#columnTable属性固定列,结果每行数据内容穿透了两遍的固定列(因为是刚开始做这个项目,所以盲猜是之前某位同仁搞个 ...
- css table表格相关设置和属性
css table表格相关设置和属性 文章目录 css table表格相关设置和属性 前言 一.表格结构 二.使用行内样式控制表格样式 1.属性 2.使用css控制表格的样式 前言 记录表格的结构,属 ...
最新文章
- Learning to Rank:X-wise
- java线程6种状态转换,java6种线程状态
- 达梦数据库导入oracle数据_Java项目,从Oracle迁移到达梦数据库笔记
- Django从理论到实战(part43)--HttpResponse对象
- python程序的书写特点_不一样的Python代码写法,让你写出一手漂亮的代码
- python增量更新数据,Python中的增量最近邻算法
- MATLAB中unwrap函数
- SCPPO(二):禅道的使用—管理员
- WCF服务重构实录(中)
- 2013年8月华为java机试题目
- python安装win32com模块
- python mock server_Mock Server 入门
- mysql 存储特殊符号_mysql 存储特殊符号
- OA系统实施:理清OA需求很关键
- 大一软件工程要学什么
- python画二维图_python3实现绘制二维点图
- SQL语法创建及管理数据表结构
- 粒子群算法(PSO)的python实现
- cmd导入python模块_Python如何导入模块
- 线性分类器良恶性乳腺癌肿瘤预测
热门文章
- 十年技术骨干面试被开出一万五薪资,直呼 “这是对我的侮辱”
- 学会这10大高性能开发技术,轻松躲过裁员名单!
- 一文带你认识keepalived,再带你通关LVS+Keepalived!
- 微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
- 不小心执行 rm -f,该如何恢复?
- 微服务落地,我们在考虑什么?| 技术头条
- linux下反删除软件,浅谈Linux文件系统反删除方法(二)
- python相对引用_Python 模块相对引用
- 自动生成考勤表_可自动变色的考勤表,逢周末自动更新,你会制作吗?
- python封装c接口_用C为python3.1封装mysql接口(一)