From 12c3e26cedd747b86324c7098b7ac0a7ec21ce86 Mon Sep 17 00:00:00 2001 From: "lixuefei.1313" Date: Wed, 3 Sep 2025 14:08:37 +0800 Subject: [PATCH] feat: add afterWordcloudShapeDraw event --- packages/vchart/src/chart/base/base-chart.ts | 4 ++- packages/vchart/src/constant/event.ts | 4 ++- packages/vchart/src/core/vchart.ts | 3 +++ packages/vchart/src/model/interface.ts | 2 ++ packages/vchart/src/series/word-cloud/base.ts | 27 +++++++++++++++---- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/vchart/src/chart/base/base-chart.ts b/packages/vchart/src/chart/base/base-chart.ts index ba51acb340..3c8f443749 100644 --- a/packages/vchart/src/chart/base/base-chart.ts +++ b/packages/vchart/src/chart/base/base-chart.ts @@ -220,7 +220,9 @@ export class BaseChart extends CompilableBase implements I globalScale: this._globalScale, onError: this._option?.onError, disableTriggerEvent: this._option?.disableTriggerEvent === true, - getSeriesData: this._chartData.getSeriesData.bind(this._chartData) + getSeriesData: this._chartData.getSeriesData.bind(this._chartData), + // @ts-ignore + dispatchEvent: (eType, params) => this._option.globalInstance.event.emit(eType, params) }; if ((this as any)._setModelOption) { diff --git a/packages/vchart/src/constant/event.ts b/packages/vchart/src/constant/event.ts index b953bd5277..2b670956e2 100644 --- a/packages/vchart/src/constant/event.ts +++ b/packages/vchart/src/constant/event.ts @@ -184,7 +184,9 @@ export enum ChartEvent { afterRender = 'afterRender', // layout afterLayout = 'afterLayout', - afterMarkLayoutEnd = 'afterMarkLayoutEnd' + afterMarkLayoutEnd = 'afterMarkLayoutEnd', + // wordcloud + afterWordcloudShapeDraw = 'afterWordcloudShapeDraw' } export enum Event_Source_Type { diff --git a/packages/vchart/src/core/vchart.ts b/packages/vchart/src/core/vchart.ts index 177ad3de7e..1177f7256e 100644 --- a/packages/vchart/src/core/vchart.ts +++ b/packages/vchart/src/core/vchart.ts @@ -320,6 +320,9 @@ export class VChart implements IVChart { private _chartSpecTransformer!: Maybe; private _compiler: Compiler; private _event: Maybe; + get event() { + return this._event; + } private _userEvents: { eType: EventType; query: EventQuery | EventCallback; diff --git a/packages/vchart/src/model/interface.ts b/packages/vchart/src/model/interface.ts index e609edba8d..f09072e200 100644 --- a/packages/vchart/src/model/interface.ts +++ b/packages/vchart/src/model/interface.ts @@ -189,6 +189,8 @@ export interface IModelOption extends ICompilableInitOption { getDimensionInfo?: (chart: IChart | undefined, pos: ILayoutPoint, isTooltip?: boolean) => IDimensionInfo[] | null; getDimensionInfoByValue?: (axis: IAxis, value: any) => IDimensionInfo | null; getRectByDimensionData?: (dimensionData: IDimensionData, layoutStartPoint: ILayoutPoint) => any; + + dispatchEvent?: (key: string, params?: any) => void; } export interface IModelSpecInfo = any> { diff --git a/packages/vchart/src/series/word-cloud/base.ts b/packages/vchart/src/series/word-cloud/base.ts index 5ecf9af519..cd05161160 100644 --- a/packages/vchart/src/series/word-cloud/base.ts +++ b/packages/vchart/src/series/word-cloud/base.ts @@ -41,6 +41,7 @@ import type { ITransformSpec } from '../../compile/interface'; import { vglobal, getTextBounds, createImage } from '@visactor/vrender-core'; import { wordCloud } from '../../theme/builtin/common/series/word-cloud'; import { LayoutZIndex } from '../../constant/layout'; +import { ChartEvent } from '../../core'; export type IBaseWordCloudSeriesSpec = Omit & { type: string }; @@ -383,11 +384,27 @@ export class BaseWordCloudSeries - this._option.globalInstance - .getChart() - .getOption() - .performanceHook?.afterWordcloudShapeDraw?.(this._option.globalInstance), + onLayoutFinished: () => { + const afterWordcloudShapeDraw = () => { + // 需要等到真正渲染完成 + this._option.globalInstance.getStage().hooks.afterRender.taps = this._option.globalInstance + .getStage() + .hooks.afterRender.taps.filter(tap => tap.fn !== afterWordcloudShapeDraw); + + this._option.dispatchEvent?.(ChartEvent.afterWordcloudShapeDraw, { + instance: this._option.globalInstance + }); + this._option.globalInstance + .getChart() + .getOption() + .performanceHook?.afterWordcloudShapeDraw?.(this._option.globalInstance); + }; + this._option.globalInstance.getStage().hooks.afterRender.taps.push({ + type: 'sync', + name: 'afterWordcloudShapeDraw', + fn: afterWordcloudShapeDraw + }); + }, dataIndexKey: DEFAULT_DATA_KEY, text: wordSpec.formatMethod ? (datum: Datum) => {