shallowRef,
Ref
} from '@vue/reactivity'
+import { watchPostEffect } from '../src/apiWatch'
// reference: https://vue-composition-api-rfc.netlify.com/api.html#watch
expect(result).toBe(true)
})
+ it('watchPostEffect', async () => {
+ const count = ref(0)
+ let result
+ const assertion = jest.fn(count => {
+ result = serializeInner(root) === `${count}`
+ })
+
+ const Comp = {
+ setup() {
+ watchPostEffect(() => {
+ assertion(count.value)
+ })
+ return () => count.value
+ }
+ }
+ const root = nodeOps.createElement('div')
+ render(h(Comp), root)
+ expect(assertion).toHaveBeenCalledTimes(1)
+ expect(result).toBe(true)
+
+ count.value++
+ await nextTick()
+ expect(assertion).toHaveBeenCalledTimes(2)
+ expect(result).toBe(true)
+ })
+
it('flush timing: sync', async () => {
const count = ref(0)
const count2 = ref(0)
Ref,
ComputedRef,
ReactiveEffect,
- ReactiveEffectOptions,
isReactive,
ReactiveFlags,
- EffectScheduler
+ EffectScheduler,
+ DebuggerOptions
} from '@vue/reactivity'
import { SchedulerJob, queuePreFlushCb } from './scheduler'
import {
type InvalidateCbRegistrator = (cb: () => void) => void
-export interface WatchOptionsBase {
+export interface WatchOptionsBase extends DebuggerOptions {
flush?: 'pre' | 'post' | 'sync'
- onTrack?: ReactiveEffectOptions['onTrack']
- onTrigger?: ReactiveEffectOptions['onTrigger']
}
export interface WatchOptions<Immediate = boolean> extends WatchOptionsBase {
return doWatch(effect, null, options)
}
+export function watchPostEffect(
+ effect: WatchEffect,
+ options?: DebuggerOptions
+) {
+ return doWatch(effect, null, (__DEV__
+ ? Object.assign(options || {}, { flush: 'post' })
+ : { flush: 'post' }) as WatchOptionsBase)
+}
+
// initial value for watchers to trigger on undefined initial values
const INITIAL_WATCHER_VALUE = {}