}
}
+let shouldTrack = true
+
+export function pauseTracking() {
+ shouldTrack = false
+}
+
+export function resumeTracking() {
+ shouldTrack = true
+}
+
export function track(
target: any,
type: OperationTypes,
key?: string | symbol
) {
+ if (!shouldTrack) {
+ return
+ }
const effect = activeReactiveEffectStack[activeReactiveEffectStack.length - 1]
if (effect) {
if (type === OperationTypes.ITERATE) {
import { callWithAsyncErrorHandling, ErrorTypeStrings } from './errorHandling'
import { warn } from './warning'
import { capitalize } from '@vue/shared'
+import { pauseTracking, resumeTracking } from '@vue/reactivity'
function injectHook(
type: LifecycleHooks,
) {
if (target) {
;(target[type] || (target[type] = [])).push((...args: any[]) => {
+ // disable tracking inside all lifecycle hooks
+ // since they can potentially be called inside effects.
+ pauseTracking()
// Set currentInstance during hook invocation.
// This assumes the hook does not synchronously trigger other hooks, which
// can only be false when the user does something really funky.
setCurrentInstance(target)
const res = callWithAsyncErrorHandling(hook, target, type, args)
setCurrentInstance(null)
+ resumeTracking()
return res
})
} else if (__DEV__) {