diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index ec66c2b2..38ec27b4 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -677,12 +677,13 @@ describe('reactivity/effect', () => { }) it('events: onStop', () => { + const onStop = jest.fn() const runner = effect(() => {}, { - onStop: jest.fn() + onStop }) stop(runner) - expect(runner.onStop).toHaveBeenCalled() + expect(onStop).toHaveBeenCalled() }) it('markNonReactive', () => { diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 73e638cd..69cecb94 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -8,11 +8,7 @@ export interface ReactiveEffect { active: boolean raw: () => T deps: Array - computed?: boolean - scheduler?: (run: Function) => void - onTrack?: (event: DebuggerEvent) => void - onTrigger?: (event: DebuggerEvent) => void - onStop?: () => void + options: ReactiveEffectOptions } export interface ReactiveEffectOptions { @@ -62,8 +58,8 @@ export function effect( export function stop(effect: ReactiveEffect) { if (effect.active) { cleanup(effect) - if (effect.onStop) { - effect.onStop() + if (effect.options.onStop) { + effect.options.onStop() } effect.active = false } @@ -79,12 +75,8 @@ function createReactiveEffect( effect._isEffect = true effect.active = true effect.raw = fn - effect.scheduler = options.scheduler - effect.onTrack = options.onTrack - effect.onTrigger = options.onTrigger - effect.onStop = options.onStop - effect.computed = options.computed effect.deps = [] + effect.options = options return effect } @@ -142,8 +134,8 @@ export function track(target: object, type: OperationTypes, key?: unknown) { if (!dep.has(effect)) { dep.add(effect) effect.deps.push(dep) - if (__DEV__ && effect.onTrack) { - effect.onTrack({ + if (__DEV__ && effect.options.onTrack) { + effect.options.onTrack({ effect, target, type, @@ -198,7 +190,7 @@ function addRunners( ) { if (effectsToAdd !== void 0) { effectsToAdd.forEach(effect => { - if (effect.computed) { + if (effect.options.computed) { computedRunners.add(effect) } else { effects.add(effect) @@ -214,17 +206,17 @@ function scheduleRun( key: unknown, extraInfo?: DebuggerEventExtraInfo ) { - if (__DEV__ && effect.onTrigger) { + if (__DEV__ && effect.options.onTrigger) { const event: DebuggerEvent = { effect, target, key, type } - effect.onTrigger(extraInfo ? extend(event, extraInfo) : event) + effect.options.onTrigger(extraInfo ? extend(event, extraInfo) : event) } - if (effect.scheduler !== void 0) { - effect.scheduler(effect) + if (effect.options.scheduler !== void 0) { + effect.options.scheduler(effect) } else { effect() } diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 4490d201..ca3b7843 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -27,10 +27,12 @@ export type ComponentObjectPropsOptions

= { export type Prop = PropOptions | PropType +type DefaultFactory = () => T | null | undefined + interface PropOptions { type?: PropType | true | null required?: boolean - default?: T | null | undefined | (() => T | null | undefined) + default?: T | DefaultFactory | null | undefined validator?(value: unknown): boolean }