From d3ebccb1ec22ef5fc7b7f3912e6b86751f1f83f4 Mon Sep 17 00:00:00 2001 From: skie1997 Date: Thu, 20 Aug 2026 15:10:46 +0800 Subject: [PATCH] fix: preserve final attributes for exit animations --- ...ow-height-exit-final-attrs_2026-08-20.json | 11 ++++ .../unit/animation/manual-ticker.test.ts | 50 +++++++++++++++++++ packages/vchart/src/mark/base/base-mark.ts | 2 + 3 files changed, 63 insertions(+) create mode 100644 common/changes/@visactor/vchart/fix-grow-height-exit-final-attrs_2026-08-20.json diff --git a/common/changes/@visactor/vchart/fix-grow-height-exit-final-attrs_2026-08-20.json b/common/changes/@visactor/vchart/fix-grow-height-exit-final-attrs_2026-08-20.json new file mode 100644 index 0000000000..80da0e8309 --- /dev/null +++ b/common/changes/@visactor/vchart/fix-grow-height-exit-final-attrs_2026-08-20.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@visactor/vchart", + "comment": "fix: preserve final attributes for exit animations when appear animations are disabled", + "type": "patch" + } + ], + "packageName": "@visactor/vchart", + "email": "skie1997@outlook.com" +} diff --git a/packages/vchart/__tests__/unit/animation/manual-ticker.test.ts b/packages/vchart/__tests__/unit/animation/manual-ticker.test.ts index db51c63806..9e6cc6a316 100644 --- a/packages/vchart/__tests__/unit/animation/manual-ticker.test.ts +++ b/packages/vchart/__tests__/unit/animation/manual-ticker.test.ts @@ -1583,6 +1583,56 @@ describe('manual ticker animation regressions', () => { } }); + it('keeps bar final attributes for exit animation when appear animation is disabled', () => { + const { container, dom } = createChartContainer(); + const ticker = createManualTicker(); + const chart = new VChart( + { + type: 'bar', + width: 400, + height: 300, + data: [ + { + id: 'barData', + values: [{ category: 'A', value: 10 }] + } + ], + dataKey: 'category', + xField: 'category', + yField: 'value', + axes: [ + { orient: 'left', visible: false }, + { orient: 'bottom', visible: false } + ], + animationAppear: false + } as IBarChartSpec, + { + dom, + ticker, + animation: true + } + ); + + chart.renderSync(); + + try { + const exitingBar = getBarGraphics(chart)[0]; + const expectedFinalY = exitingBar.context.finalAttrs.y; + const expectedFinalY1 = exitingBar.context.finalAttrs.y1; + + expect(() => { + chart.updateDataSync('barData', [{ category: 'B', value: 20 }]); + }).not.toThrow(); + expect(exitingBar.context.diffState).toBe('exit'); + expectClose(getGraphicFinalAttribute(exitingBar).y, expectedFinalY); + expectClose(getGraphicFinalAttribute(exitingBar).y1, expectedFinalY1); + } finally { + chart.release(); + ticker.release(); + removeDom(container); + } + }); + it('keeps horizontal bar sorted update final y at the reordered axis positions', () => { const { container, dom } = createChartContainer(); const ticker = createManualTicker(); diff --git a/packages/vchart/src/mark/base/base-mark.ts b/packages/vchart/src/mark/base/base-mark.ts index a2e46d34bc..8df921673a 100644 --- a/packages/vchart/src/mark/base/base-mark.ts +++ b/packages/vchart/src/mark/base/base-mark.ts @@ -1410,6 +1410,8 @@ export class BaseMark extends GrammarItem implements IMar diffState, // 从旧context中继承 reusing: g.context?.reusing, + // exit图元不会再次执行encoder,需要保留上一轮的最终属性用于退场动画 + finalAttrs: g.context?.finalAttrs, // 从旧context中继承 originalFieldX: g.context?.originalFieldX, // 从旧context中继承