-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheffect.ts
87 lines (75 loc) · 2.16 KB
/
effect.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
interface OnStop {
onStop: () => void;
}
interface ReactiveEffectOption {
scheduler: () => void;
}
interface Runner {
effect: ReactiveEffect;
(): void;
}
type ReactiveEffectOptionKey = keyof ReactiveEffectOption
class ReactiveEffectOptionValue {
constructor(private options: Partial<ReactiveEffectOption> = {}) { }
get<T extends ReactiveEffectOptionKey>(key: T, defaultValue?: ReactiveEffectOption[T]): ReactiveEffectOption[T] | undefined {
return this.options?.[key] ?? defaultValue
}
}
export class ReactiveEffect<T extends Function = Function> {
/**当前effect */
static activeEffect: ReactiveEffect | undefined = undefined
/**是否应该track的标记 */
// static shouldTrack = true
/**是否可以track */
// static get isTrackable() {
// return ReactiveEffect.shouldTrack && ReactiveEffect.activeEffect !== undefined
// }
// static cleanup(effect: ReactiveEffect) {
// if (ReactiveEffect.activeEffect) {
// for (const deps of effect.deps) {
// deps.delete(effect)
// }
// effect.deps = []
// }
// }
deps: Array<Set<ReactiveEffect>> = []
active = true
_onStop?: () => void
constructor(private fn: T, private _options: Partial<ReactiveEffectOption> = {}) { }
get options() {
return new ReactiveEffectOptionValue(this._options)
}
set onStop(fn: (() => void) | undefined) {
this._onStop = fn
}
run() {
// if (!this.active) {
// return this.fn()
// }
// ReactiveEffect.shouldTrack = true
ReactiveEffect.activeEffect = this
const res = this.fn()
// ReactiveEffect.shouldTrack = false
return res
}
// stop() {
// ReactiveEffect.cleanup(this)
// this._onStop?.()
// this.active = false
// }
}
export function effect<T extends Function>(fn: T, options?: Partial<ReactiveEffectOption & OnStop>) {
// 分解options
const { onStop, ...EffectOptions } = options ?? {}
const _effect = new ReactiveEffect(fn, EffectOptions)
// _effect.onStop = onStop
_effect.run()
const runner = (() => {
_effect.run()
}) as Runner
runner.effect = _effect
return runner
}
// export function stop(effect: ReactiveEffect) {
// effect.stop()
// }