fix: preserve final attributes for exit animations - #4646
Conversation
xuefei1313
left a comment
There was a problem hiding this comment.
🦞 Aime Bot Review
这次改动主要做了三件事:一是在 BaseMark 复用旧 context 时补上 finalAttrs 继承,避免 exit 图元在关闭 appear 动画时丢失退场动画所需的最终属性;二是补了一组 manual-ticker 回归用例,验证 animationAppear: false 时更新数据不会抛错,且退出柱子的 y/y1 仍保持预期;三是补充了 changelog,整体链路比较完整。
代码层面看,修复点放在 packages/vchart/src/mark/base/base-mark.ts 的通用上下文继承逻辑上,方向是对的,不过它的影响面会比当前新增的 bar 用例更广。测试文件这次覆盖得比较聚焦,资源释放也完整,这部分没有额外问题。这里想请确认一下:是否还需要再补一组非 bar mark 的回归用例,或者在 PR 描述里补充说明已有其他测试/场景能够间接覆盖 animationAppear: false + exit diffState 这条通用路径?这样后续回归时会更容易判断这次修复的边界。
从当前 diff 来看,修复思路直接、风险也比较可控。如果上面这个覆盖范围已经确认,我这边倾向于可以合并。
|
🦞 Aime Bot Review 改动摘要本次修复解决了在关闭入场动画( 代码观察
小建议
合并建议改动清晰、范围可控,测试覆盖合理,建议合并 ✅。 |
[中文版模板 / Chinese template]
🤔 This is a ...
🔗 Related issue link
🔗 Related PR link
🐞 Bugserver case id
💡 问题背景与修复方案
问题背景
当配置
animationAppear: false、同时保留默认退场动画时,如果将柱状图数据整体替换为一组不同的 key,退场动画执行期间会抛出以下异常:异常由以下生命周期触发:
finalAttribute。context时,丢失了上一轮的finalAttrs属性快照。AnimateExecutor在执行growHeightOut前没有可同步的最终属性;随后读取graphic.getFinalAttribute().y时触发异常。因此,该问题并非业务数据缺少
yField或数据内容非法,而是 VChart 图元 diff 与退场动画之间的生命周期契约问题。修复方案
在 mark 数据 diff 重建图元
context时,保留上一轮的context.finalAttrs。仍处于活动状态的 enter/update 图元会在后续 encoder 阶段覆盖这份快照;exit 图元则可以保留最后一次有效的编码属性,供退场动画使用。该修复继续沿用已有的
context.finalAttrs -> setFinalAttributes -> growHeightOut标准链路,无需在 VRender 的逐图元动画热路径中增加宽泛的运行时兜底。验证结果
animationAppear: false、保留默认退场动画以及柱图数据 key 全量替换的场景。undefined.y异常,修复后正常通过。📝 Changelog
☑️ Self-Check before Merge
🚀 Summary
copilot:summary
🔍 Walkthrough
copilot:walkthrough