fix(reactivity): avoid cross-component dependency leaks in setup()

This commit is contained in:
Evan You
2020-02-17 23:14:07 -05:00
parent 202532c301
commit d9d63f21b1
5 changed files with 27 additions and 7 deletions

View File

@@ -95,11 +95,13 @@ function run(effect: ReactiveEffect, fn: Function, args: unknown[]): unknown {
if (!effectStack.includes(effect)) {
cleanup(effect)
try {
enableTracking()
effectStack.push(effect)
activeEffect = effect
return fn(...args)
} finally {
effectStack.pop()
resetTracking()
activeEffect = effectStack[effectStack.length - 1]
}
}
@@ -116,15 +118,23 @@ function cleanup(effect: ReactiveEffect) {
}
let shouldTrack = true
const trackStack: boolean[] = []
export function pauseTracking() {
trackStack.push(shouldTrack)
shouldTrack = false
}
export function resumeTracking() {
export function enableTracking() {
trackStack.push(shouldTrack)
shouldTrack = true
}
export function resetTracking() {
const last = trackStack.pop()
shouldTrack = last === undefined ? true : last
}
export function track(target: object, type: TrackOpTypes, key: unknown) {
if (!shouldTrack || activeEffect === undefined) {
return

View File

@@ -21,8 +21,11 @@ export {
export {
effect,
stop,
trigger,
track,
enableTracking,
pauseTracking,
resumeTracking,
resetTracking,
ITERATE_KEY,
ReactiveEffect,
ReactiveEffectOptions,