callWithErrorHandling,
callWithAsyncErrorHandling
} from './errorHandling'
-import { onBeforeUnmount } from './apiLifecycle'
import { queuePostRenderEffect } from './renderer'
import { warn } from './warning'
function doWatch(
source: WatchSource | WatchSource[] | WatchEffect,
cb: WatchCallback | null,
- { immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ
+ { immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ,
+ instance = currentInstance
): WatchStopHandle {
if (__DEV__ && !cb) {
if (immediate !== undefined) {
)
}
- const instance = currentInstance
-
let getter: () => any
if (isArray(source)) {
getter = () =>
const getter = isString(source)
? () => publicThis[source]
: source.bind(publicThis)
- const stop = watch(getter, cb.bind(publicThis), options)
- onBeforeUnmount(stop, this)
- return stop
+ return doWatch(getter, cb.bind(publicThis), options, this)
}
function traverse(value: unknown, seen: Set<unknown> = new Set()) {
if (bum) {
invokeArrayFns(bum)
}
- if (effects) {
- for (let i = 0; i < effects.length; i++) {
- stop(effects[i])
- }
- }
// update may be null if a component is unmounted before its async
// setup has resolved.
if (update) {
stop(update)
unmount(subTree, instance, parentSuspense, doRemove)
}
+ if (effects) {
+ queuePostRenderEffect(() => {
+ for (let i = 0; i < effects.length; i++) {
+ stop(effects[i])
+ }
+ }, parentSuspense)
+ }
// unmounted hook
if (um) {
queuePostRenderEffect(um, parentSuspense)