时间:2020/04/26 ,转载请注明出处。

写在前面

antd团队于2020年2月发布了酝酿已久的antd@4.0版本,对样式的调整、部分组件逻辑的重构都进行了较大改动,本文针对Table的rowKey属性重构作分析。

由一个mistake带来的思考

在数据治理模块的表格中使用了Table点击表格行进而选中该行的功能¹(非checkbox,点此查看官方demo),升级4.0后发现被选中表格行的className缺少了 ant-table-row-selected,导致交互效果失效。因为升级前后代码未作变动却出现问题,antd官方也并未声明该部分的改动,反复排查也没有找到问题所在。

图 1 实现效果

后来意识到因为rowKey属性具有默认值"key",在不做显式设置的情况下,组件对此无感知,antd未做声明可能是因为该功能不会显式地对组件的使用产生影响,而此处出错的原因是我将rowKey错误地显式设置成"id"(dataSourcerecord的唯一主键是"key",与"id"不一致,导致错误)。有意思的是v3.x竟然没报错,并且可以正常使用。基于此疑惑与不解,我去翻看了源码,探究rowKey属性值究竟会否以及如何影响样式的变化。

在源码的对比中发现问题所在

借助VSCode的gitlens扩展²,快速定位到了Table@4.x中对rowKey属性的changelog。

图 2

发现antd对Table进行了大量样式上的改写,其中在PR(#19678)³中新增加了一个用于修改 rowClassName 的新方法 internalRowClassName ⁴。

图 3
图 4

在这个方法中,通过 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 类名。

图 5

由此看到,4.0版本中要求rowKey属性必须传入正确的值。那么为什么*rowKey传入错误的值在3.x版本中却没有报错呢?*

带着疑问,我将antd切到了branch@3.x-stable分支中再次查看getRowKey方法,发现 3.x中 getRecordKey 的返回值并不会受 rowKey 被错误设置的影响,它永远可以返回一个正确可用的key值⁶,因此不会出现上述问题。

图 6

真相大白。

如此一来,antd@3.x中rowKey属性的值实质上并不会对组件的使用产生报错性的影响(但会抛出warning),这也就解释了开篇中该mistake的问题所在。4.x对rowKey属性的改写以及rowClassName方法的新增,优化了Table组件的正确合理使用。antd将该PR定性为重构(Refactoring)⁷。

图 7

antd新增一行页码不正确_antd-Table@4.x对rowKey属性的重构相关推荐

  1. Html5-如何正确给table加边框

    Html5-如何正确给table加边框 分析单个属性的效果 一.表格边框 border="1" 二.cellspacing单元格间距 三.cellpadding单元格边距 四.去掉 ...

  2. kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)

    目标:layui 实现点击按钮添加一行 解决方案: 方案1.table 是用转换静态表格的方式创建的,写一个button,每次点击按钮,就添加一个 标签: 方案2.table 是用方法渲染的方式创建的 ...

  3. layui当前表格第一行_layui数据表格新增一行

    方案一 layui的数据表格集成了查看编辑删除等功能,但新增功能官方文档却没有提及,当业务需求需要点击新增一行时,可用如下方式实现 实现的思路是:当点击新增一行时,把之前的数据保存下来,并在数据尾部增 ...

  4. handsontable mysql_Handsontable 新增一行 默认值

    效果图: aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVYAAACOCAIAAADl17ciAAALCklEQVR4nO2d0XmrvBJFXZQ7o ...

  5. vi vim 快速跳到文件末尾 GA 在最后一行下方新增一行 (光标换行,文字不换行) GO

    vim 快速跳到文件末尾 在最后一行下方新增一行 移到末尾,并且进入文本录入模式 GA 在一般模式(刚进入的模式,esc模式) 先 G 或 shift+g 到最后一行 然后 A 或 shift+a 到 ...

  6. Html-浅谈如何正确给table加边框

    Html-浅谈如何正确给table加边框 一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式. 1 <style>2 table,table tr th, ta ...

  7. Html:正确给table表格加边框

    目录 方式一:属性方式 方式二:css方式(推荐) 表格代码 <table><thead><tr><th>序号</th><th> ...

  8. 使用NG-ZORRO(Angular 组件库)中Table组件,通过columnTable属性固定列,结果每行数据内容穿透了两遍的固定列;鼠标滑过该条数据时,两侧固定列的背景色不跟着改变~

    [问题] 使用NG-ZORRO(Angular 组件库)中Table组件,通过#columnTable属性固定列,结果每行数据内容穿透了两遍的固定列(因为是刚开始做这个项目,所以盲猜是之前某位同仁搞个 ...

  9. css table表格相关设置和属性

    css table表格相关设置和属性 文章目录 css table表格相关设置和属性 前言 一.表格结构 二.使用行内样式控制表格样式 1.属性 2.使用css控制表格的样式 前言 记录表格的结构,属 ...

最新文章

  1. Learning to Rank:X-wise
  2. java线程6种状态转换,java6种线程状态
  3. 达梦数据库导入oracle数据_Java项目,从Oracle迁移到达梦数据库笔记
  4. Django从理论到实战(part43)--HttpResponse对象
  5. python程序的书写特点_不一样的Python代码写法,让你写出一手漂亮的代码
  6. python增量更新数据,Python中的增量最近邻算法
  7. MATLAB中unwrap函数
  8. SCPPO(二):禅道的使用—管理员
  9. WCF服务重构实录(中)
  10. 2013年8月华为java机试题目
  11. python安装win32com模块
  12. python mock server_Mock Server 入门
  13. mysql 存储特殊符号_mysql 存储特殊符号
  14. OA系统实施:理清OA需求很关键
  15. 大一软件工程要学什么
  16. python画二维图_python3实现绘制二维点图
  17. SQL语法创建及管理数据表结构
  18. 粒子群算法(PSO)的python实现
  19. cmd导入python模块_Python如何导入模块
  20. 线性分类器良恶性乳腺癌肿瘤预测

热门文章

  1. 十年技术骨干面试被开出一万五薪资,直呼 “这是对我的侮辱”
  2. 学会这10大高性能开发技术,轻松躲过裁员名单!
  3. 一文带你认识keepalived,再带你通关LVS+Keepalived!
  4. 微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
  5. 不小心执行 rm -f,该如何恢复?
  6. 微服务落地,我们在考虑什么?| 技术头条
  7. linux下反删除软件,浅谈Linux文件系统反删除方法(二)
  8. python相对引用_Python 模块相对引用
  9. 自动生成考勤表_可自动变色的考勤表,逢周末自动更新,你会制作吗?
  10. python封装c接口_用C为python3.1封装mysql接口(一)