Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 97x 97x 97x 1577x 1577x 1577x 1577x 2x 2x 18x 17x 17x 17x 17x 1x 1x 2578x 2516x 2516x 2560x 2498x 2498x 209x 223x 209x 209x 1x 209x 1x 1x 209x 97x 1x 97x 1561x 1561x 1277x 97x 97x 5x 4x 1x 1x | import { ReactiveEffect } from './effect' import { warn } from './warning' let activeEffectScope: EffectScope | undefined const effectScopeStack: EffectScope[] = [] export class EffectScope { active = true effects: ReactiveEffect[] = [] cleanups: (() => void)[] = [] parent: EffectScope | undefined scopes: EffectScope[] | undefined /** * track a child scope's index in its parent's scopes array for optimized * removal */ private index: number | undefined constructor(detached = false) { if (!detached && activeEffectScope) { this.parent = activeEffectScope this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( this ) - 1 } } run<T>(fn: () => T): T | undefined { if (this.active) { try { this.on() return fn() } finally { this.off() } } else if (__DEV__) { warn(`cannot run an inactive effect scope.`) } } on() { if (this.active) { effectScopeStack.push(this) activeEffectScope = this } } off() { if (this.active) { effectScopeStack.pop() activeEffectScope = effectScopeStack[effectScopeStack.length - 1] } } stop(fromParent?: boolean) { if (this.active) { this.effects.forEach(e => e.stop()) this.cleanups.forEach(cleanup => cleanup()) if (this.scopes) { this.scopes.forEach(e => e.stop(true)) } // nested scope, dereference from parent to avoid memory leaks if (this.parent && !fromParent) { // optimized O(1) removal const last = this.parent.scopes!.pop() Iif (last && last !== this) { this.parent.scopes![this.index!] = last last.index = this.index! } } this.active = false } } } export function effectScope(detached?: boolean) { return new EffectScope(detached) } export function recordEffectScope( effect: ReactiveEffect, scope?: EffectScope | null ) { scope = scope || activeEffectScope if (scope && scope.active) { scope.effects.push(effect) } } export function getCurrentScope() { return activeEffectScope } export function onScopeDispose(fn: () => void) { if (activeEffectScope) { activeEffectScope.cleanups.push(fn) } else if (__DEV__) { warn( `onScopeDispose() is called when there is no active effect scope` + ` to be associated with.` ) } } |