布局元素
布局元素承接图表模块的布局信息,同时负责参与布局逻辑。它的实现在仓库这个地址
packages/vchart/src/layout/layout-item.ts
下面详细介绍布局元素的详细代码
接收布局配置
在代码的中,布局元素通过 setAttrFromSpec 生命周期读取spec中的布局配置,并且在 onLayoutStart 时会额外计算一次布局配置中的像素值。
// line: 191 setAttrFromSpec(spec: ILayoutItemSpec, chartViewRect: ILayoutRect) { this._spec = spec; this.layoutType = spec.layoutType ?? this.layoutType; this.layoutLevel = spec.layoutLevel ?? this.layoutLevel; this.layoutOrient = spec.orient ?? this.layoutOrient; this._setLayoutAttributeFromSpec(spec, chartViewRect); this.layoutClip = spec.clip ?? this.layoutClip; } onLayoutStart(layoutRect: IRect, viewRect: ILayoutRect, ctx: any) { // 在 layoutStart 时重新计算 spec 中的布局属性值 // 确保 resize 后,这些值保持正确的px值。 this._setLayoutAttributeFromSpec(this._spec, viewRect); }
计算布局像素值的逻辑包括百分比字符串,函数配置等,布局数值的统一计算逻辑在这里
// packages/vchart/src/util/space.ts
export function calcLayoutNumber(
v: ILayoutNumber | undefined,
size: number,
callOp?: ILayoutRect, //如果是函数类型的话,函数的参数
defaultValue: number = 0
) {
if (isNumber(v)) {
return v;
}
if (isPercent(v)) {
return (Number(v.substring(0, v.length - 1)) * size) / 100;
}
if (isFunction(v)) {
return v(callOp);
}
if (isObject(v)) {
return size * (v.percent ?? 0) + (v.offset ?? 0);
}
return defaultValue;
}