feat(antd): ArrayTable/ArrayItems sortable impl replace react-sortable-hoc to @dnd-kit - #3855
Conversation
Codecov ReportPatch and project coverage have no change.
Additional details and impacted files@@ Coverage Diff @@
## formily_next #3855 +/- ##
=============================================
Coverage 96.59% 96.59%
=============================================
Files 152 152
Lines 6695 6695
Branches 1810 1810
=============================================
Hits 6467 6467
Misses 228 228 ☔ View full report in Codecov by Sentry. |
|
你的提交邮箱没有用github邮箱,导致CLA这边出问题了 |
fee134f to
7384c52
Compare
| content={props.children} | ||
| trigger="click" | ||
| destroyTooltipOnHide | ||
| // destroyTooltipOnHide |
There was a problem hiding this comment.
对应下方问题 2
destroyTooltipOnHide 的情况下, 在 ArrayItems 的例子中,在 Editable.Popover 编辑的 object 对象之后, 会引起下面的问题, 在文档中这一块
formily/packages/antd/docs/components/ArrayItems.md
Lines 151 to 180 in fee134f
| return field.setPattern('readPretty') | ||
| } | ||
| }, [pattern]) | ||
| }, [pattern, field]) |
CLA 修正过了 |
没太理解,为啥会影响 editable ,之前没问题? |
react-sortable-hoc 替换为 @dnt-kit 之后, 新的拖拽跟 Editable 一起使用会有上面截图和评论提到的两个问题; 这两个问题是在使用 @dnd-kit 之后出现的, 原来 react-sortable-hoc 没有这个问题, 之前 commit 也有这个问题, 只是没有发现, 在重新整理 commit 做测试的时候发现了, 所以对 Editable 代码做了一些改动 |
|
第一个问题我觉得还好,第二个问题还是再排查一下?我对注释代码,删除代码这种改动特别害怕😨 |
ac75f2f to
f107958
Compare
emmmm, 修复了,简单来说问题就是 保持 SortableItem id(key) 的稳定性, 顺便问一下 antd-v5 代码怎么找? |
|
https://github.com/formilyjs/antd 这个仓库,你可以看看你这边的问题antd5那边有没有,我那边用的@dnd-kit,不过也没有太过详细的测试,并且性能不算太好 |
性能是感受?还是有测试能跑?我在 ArrayTable load 10W 数据的 demo 对比了一下, hoc vs dnd-kit 都有肉眼可见的卡顿, 数量少的话不会 |
|
数据多了拖拽有明显的卡顿 |
|
不过刚看了下antd的,好像也有卡顿,只不过没那么明显 |
因吹斯汀,我跑了下 ArrayTable 10W 数据的 Demo , 并 通过火焰图和log 做了一下对比,发现 https://github.com/formilyjs/antd/blob/master/packages/components/src/array-table/index.tsx#L375 但针对 antd-v5 demo 中的耗时情况是 @formily/core 中 array.move 方法里面 这两个 splice 花费了很多时间(初步测试为 splice 导致整个 array 重新 observer 导致), 我尝试用 patch node_modeuls 方法改动了一下, 性能获得了明显提升 (2.8s -> 30ms), 但是问题也很明显, 会导致对应 field 的 observer 语意变更, 这里有个 compare 添加了一些测试用例来说明这个语意变更 https://github.com/alibaba/formily/compare/formily_next...charlzyx:pref/core-array-move-by-slice-repalce?expand=1 |
| // useUniquIdMap 内部使用 WeakMap 来制造唯一 id, 所以 | ||
| // 如果是简单值, 需要包装为 对象, 这样才能够座位 | ||
| // WeakMap 的 key 值来使用 | ||
| const boxedDataSource = dataSource.map((item) => { |
weakmap 维护 key,然后通过遍历 dataSource 的方式来收集,这一块逻辑感觉对性能影响比较大 |
我在参考 v5 的方式,他好像是没用到 id 制造器的,但是发现前置任务 core/array 使用内部使用 splice 导致的性能问题,所以我准备先把性能问题修了,再看 dnd 能不能从 消化一下 v5 抄过来 短视的看的话 可能基于 items 的长度上限可能并不高,table 10w 也根据分页做了 slice 所以实际 weakmap 倒不会特别重,只是要造 id 依赖收集的问题在这个方案里避免不了,10w 实际拖拽卡顿与 hoc 体感一致 |
f107958 to
73e4818
Compare
重新实现啦, 这次抄的 antd-v5, 暂时把 Table rowKey 支持移除了, 回头另起 PR 吧 |
fixed by #3863 |
18edace to
ed5df07
Compare
2023-07-18.18.52.07.mov两个问题,辛苦修复一下?
|


Before submitting a pull request, please make sure the following is done...
masterorformily_next.npm test).npm run lint) - we've done our best to make sure these rules match our internal linting guidelines.Please do not delete the above content
What have you changed?
2. 功能: ArrayTable 组件增加自定义 rowKey 属性支持3. 新的排序影响到 Editable 组件的一点逻辑变更