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

@@ -9,7 +9,7 @@ import { ComponentPublicInstance } from './componentProxy'
import { callWithAsyncErrorHandling, ErrorTypeStrings } from './errorHandling'
import { warn } from './warning'
import { capitalize } from '@vue/shared'
import { pauseTracking, resumeTracking, DebuggerEvent } from '@vue/reactivity'
import { pauseTracking, resetTracking, DebuggerEvent } from '@vue/reactivity'
export { onActivated, onDeactivated } from './components/KeepAlive'
@@ -39,7 +39,7 @@ export function injectHook(
setCurrentInstance(target)
const res = callWithAsyncErrorHandling(hook, target, type, args)
setCurrentInstance(null)
resumeTracking()
resetTracking()
return res
})
if (prepend) {

View File

@@ -1,5 +1,10 @@
import { VNode, VNodeChild, isVNode } from './vnode'
import { ReactiveEffect, shallowReadonly } from '@vue/reactivity'
import {
ReactiveEffect,
shallowReadonly,
pauseTracking,
resetTracking
} from '@vue/reactivity'
import {
PublicInstanceProxyHandlers,
ComponentPublicInstance,
@@ -341,12 +346,14 @@ function setupStatefulComponent(
currentInstance = instance
currentSuspense = parentSuspense
pauseTracking()
const setupResult = callWithErrorHandling(
setup,
instance,
ErrorCodes.SETUP_FUNCTION,
[propsProxy, setupContext]
)
resetTracking()
currentInstance = null
currentSuspense = null

View File

@@ -1,7 +1,7 @@
import { VNode } from './vnode'
import { Data, ComponentInternalInstance, Component } from './component'
import { isString, isFunction } from '@vue/shared'
import { toRaw, isRef, pauseTracking, resumeTracking } from '@vue/reactivity'
import { toRaw, isRef, pauseTracking, resetTracking } from '@vue/reactivity'
import { callWithErrorHandling, ErrorCodes } from './errorHandling'
type ComponentVNode = VNode & {
@@ -60,7 +60,7 @@ export function warn(msg: string, ...args: any[]) {
console.warn(...warnArgs)
}
resumeTracking()
resetTracking()
}
function getComponentTrace(): ComponentTraceStack {