diff --git a/common/changes/@visactor/vchart/fix-process-render-bug_2026-05-12-06-22.json b/common/changes/@visactor/vchart/fix-process-render-bug_2026-05-12-06-22.json new file mode 100644 index 0000000000..da8d3a8e24 --- /dev/null +++ b/common/changes/@visactor/vchart/fix-process-render-bug_2026-05-12-06-22.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vchart", + "comment": "fix: prcoess render error. fix#4578", + "type": "none" + } + ], + "packageName": "@visactor/vchart" +} \ No newline at end of file diff --git a/packages/vchart/__tests__/unit/mark/area.test.ts b/packages/vchart/__tests__/unit/mark/area.test.ts new file mode 100644 index 0000000000..c71aca2443 --- /dev/null +++ b/packages/vchart/__tests__/unit/mark/area.test.ts @@ -0,0 +1,46 @@ +import { markContext as ctx } from '../../util/context'; +import { AreaMark } from '../../../src/mark/area'; + +describe('Area Mark', () => { + it('should not mutate existing progressive segments in place', () => { + const areaMark = new AreaMark('area1', ctx); + areaMark.created(); + + (areaMark as any).renderContext = { + progressive: { + currentIndex: 1 + } + }; + (areaMark as any)._keyGetter = (datum: any) => datum.x; + + const existingSegments = [ + { + points: [{ x: 0, y: 0, y1: 100 }] + } + ]; + const graphic = { + attribute: { + segments: existingSegments + }, + context: { + data: [ + { x: 1, y: 10, y1: 100 }, + { x: 2, y: 20, y1: 100 } + ] + } + }; + + const result = (areaMark as any)._runPointsEncoder( + { + x: (datum: any) => datum.x, + y: (datum: any) => datum.y, + y1: (datum: any) => datum.y1 + }, + graphic + ); + + expect(existingSegments).toHaveLength(1); + expect(result.segments).toHaveLength(2); + expect(result.segments).not.toBe(existingSegments); + }); +}); diff --git a/packages/vchart/__tests__/unit/mark/line.test.ts b/packages/vchart/__tests__/unit/mark/line.test.ts index df4e091545..74e6422cba 100644 --- a/packages/vchart/__tests__/unit/mark/line.test.ts +++ b/packages/vchart/__tests__/unit/mark/line.test.ts @@ -53,6 +53,47 @@ describe('Line Mark', () => { expect((lineMark4 as any)._segmentStyleKeys.length).toBe(0); }); + it('should not mutate existing progressive segments in place', () => { + const lineMark = new LineMark('line1', ctx); + lineMark.created(); + + (lineMark as any).renderContext = { + progressive: { + currentIndex: 1 + } + }; + (lineMark as any)._keyGetter = (datum: any) => datum.x; + + const existingSegments = [ + { + points: [{ x: 0, y: 0 }] + } + ]; + const graphic = { + attribute: { + segments: existingSegments + }, + context: { + data: [ + { x: 1, y: 10 }, + { x: 2, y: 20 } + ] + } + }; + + const result = (lineMark as any)._runPointsEncoder( + { + x: (datum: any) => datum.x, + y: (datum: any) => datum.y + }, + graphic + ); + + expect(existingSegments).toHaveLength(1); + expect(result.segments).toHaveLength(2); + expect(result.segments).not.toBe(existingSegments); + }); + // FIXME: 'fill' does not exist in type 'IMarkSpec' // it('ignoreAttributes', () => { // const lineMark = new LineMark('line', ctx); diff --git a/packages/vchart/src/mark/base/base-line.ts b/packages/vchart/src/mark/base/base-line.ts index 88a2d70a92..2776f5b06d 100644 --- a/packages/vchart/src/mark/base/base-line.ts +++ b/packages/vchart/src/mark/base/base-line.ts @@ -171,7 +171,7 @@ export abstract class BaseLineMark