refactor(reactivity): simplify effect options

This commit is contained in:
Evan You 2019-10-30 11:11:23 -04:00
parent c6cbca25fe
commit 247c53672d
3 changed files with 17 additions and 22 deletions

View File

@ -677,12 +677,13 @@ describe('reactivity/effect', () => {
}) })
it('events: onStop', () => { it('events: onStop', () => {
const onStop = jest.fn()
const runner = effect(() => {}, { const runner = effect(() => {}, {
onStop: jest.fn() onStop
}) })
stop(runner) stop(runner)
expect(runner.onStop).toHaveBeenCalled() expect(onStop).toHaveBeenCalled()
}) })
it('markNonReactive', () => { it('markNonReactive', () => {

View File

@ -8,11 +8,7 @@ export interface ReactiveEffect<T = any> {
active: boolean active: boolean
raw: () => T raw: () => T
deps: Array<Dep> deps: Array<Dep>
computed?: boolean options: ReactiveEffectOptions
scheduler?: (run: Function) => void
onTrack?: (event: DebuggerEvent) => void
onTrigger?: (event: DebuggerEvent) => void
onStop?: () => void
} }
export interface ReactiveEffectOptions { export interface ReactiveEffectOptions {
@ -62,8 +58,8 @@ export function effect<T = any>(
export function stop(effect: ReactiveEffect) { export function stop(effect: ReactiveEffect) {
if (effect.active) { if (effect.active) {
cleanup(effect) cleanup(effect)
if (effect.onStop) { if (effect.options.onStop) {
effect.onStop() effect.options.onStop()
} }
effect.active = false effect.active = false
} }
@ -79,12 +75,8 @@ function createReactiveEffect<T = any>(
effect._isEffect = true effect._isEffect = true
effect.active = true effect.active = true
effect.raw = fn 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.deps = []
effect.options = options
return effect return effect
} }
@ -142,8 +134,8 @@ export function track(target: object, type: OperationTypes, key?: unknown) {
if (!dep.has(effect)) { if (!dep.has(effect)) {
dep.add(effect) dep.add(effect)
effect.deps.push(dep) effect.deps.push(dep)
if (__DEV__ && effect.onTrack) { if (__DEV__ && effect.options.onTrack) {
effect.onTrack({ effect.options.onTrack({
effect, effect,
target, target,
type, type,
@ -198,7 +190,7 @@ function addRunners(
) { ) {
if (effectsToAdd !== void 0) { if (effectsToAdd !== void 0) {
effectsToAdd.forEach(effect => { effectsToAdd.forEach(effect => {
if (effect.computed) { if (effect.options.computed) {
computedRunners.add(effect) computedRunners.add(effect)
} else { } else {
effects.add(effect) effects.add(effect)
@ -214,17 +206,17 @@ function scheduleRun(
key: unknown, key: unknown,
extraInfo?: DebuggerEventExtraInfo extraInfo?: DebuggerEventExtraInfo
) { ) {
if (__DEV__ && effect.onTrigger) { if (__DEV__ && effect.options.onTrigger) {
const event: DebuggerEvent = { const event: DebuggerEvent = {
effect, effect,
target, target,
key, key,
type type
} }
effect.onTrigger(extraInfo ? extend(event, extraInfo) : event) effect.options.onTrigger(extraInfo ? extend(event, extraInfo) : event)
} }
if (effect.scheduler !== void 0) { if (effect.options.scheduler !== void 0) {
effect.scheduler(effect) effect.options.scheduler(effect)
} else { } else {
effect() effect()
} }

View File

@ -27,10 +27,12 @@ export type ComponentObjectPropsOptions<P = Data> = {
export type Prop<T> = PropOptions<T> | PropType<T> export type Prop<T> = PropOptions<T> | PropType<T>
type DefaultFactory<T> = () => T | null | undefined
interface PropOptions<T = any> { interface PropOptions<T = any> {
type?: PropType<T> | true | null type?: PropType<T> | true | null
required?: boolean required?: boolean
default?: T | null | undefined | (() => T | null | undefined) default?: T | DefaultFactory<T> | null | undefined
validator?(value: unknown): boolean validator?(value: unknown): boolean
} }