-
Notifications
You must be signed in to change notification settings - Fork 5
组件与扩展管理器的 extraData
花生PeA edited this page Feb 23, 2019
·
2 revisions
在 Short Night 的世界里,有2个“非法之地”可以供 Timeline 作者为所欲为。
- 扩展管理器的
.extraData
:所有 Component 都共享的一个对象 - 组件内部的
.extraData
:每个 Component 独立的一个对象
比如我想要统计每个 Component 被调用.apply()
的次数,那么这时就应该使用每个 Component 内的.extraData
。有2个方式实现:
-
- 通过新增一个扩展
-
- 通过在每个 Component 的
apply()
中增加逻辑
- 通过在每个 Component 的
显然应该通过扩展来解决。代码如下:
import { Extension, ExtensionManager } from 'short-night/extensions';
import { Component } from 'short-night';
import { ExtraData } from 'short-night/common/Component';
declare module 'short-night/common/Component' { // 声明 Component 下的 ExtraData 新增一个属性
export interface ExtraData {
applyCount? :number;
}
}
export default class ApplyCounter implements Partial<Extension> {
constructor(public etx:ExtensionManager) {}
async onApply(comp:Component) {
if ('applyCount' in comp.extraData) {
comp.extraData.applyCount!++;
} else {
comp.extraData.applyCount = 1;
}
}
onDraw (comp:Component){
console.log(`${comp.name}: ${comp.extraData.applyCount}`);
}
}
上边的需求的统计“每个 Component 被调用.apply()
的次数”,如果我想统计全部 Component 的总和呢?那么这时候就需要用ext.extraData
了。代码如下:
import { Extension, ExtensionManager } from 'short-night/extensions';
import { ExtraData } from 'short-night/extensions';
import { Component, Timeline } from 'short-night';
declare module 'short-night/extensions' { // 声明 ext 下的 ExtraData 新增一个属性
export interface ExtraData {
applyCountAll? :number;
}
}
export default class ApplyCounter implements Partial<Extension> {
constructor(public etx:ExtensionManager) {
this.etx.extraData.applyCountAll = 0;
}
async onApply(comp:Component) {
this.etx.extraData.applyCountAll!++;
}
onDraw(comp:Component) {
if (Timeline.is(comp)) { // 保证只打印一次
console.log(`amount: ${this.etx.extraData.applyCountAll}`);
}
}
}