]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(reactivity): simplify effect options
authorEvan You <yyx990803@gmail.com>
Wed, 30 Oct 2019 15:11:23 +0000 (11:11 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 30 Oct 2019 15:11:23 +0000 (11:11 -0400)
packages/reactivity/__tests__/effect.spec.ts
packages/reactivity/src/effect.ts
packages/runtime-core/src/componentProps.ts

index ec66c2b2c23cafa2cad44f51244bcf7cec2cc1a3..38ec27b4ba9c19a38637d774636af342f167b093 100644 (file)
@@ -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', () => {
index 73e638cd36bc9d7a06d06b84e2a5e34c94d00ad5..69cecb94ee065136634c3d55f6e98df2c89d1c39 100644 (file)
@@ -8,11 +8,7 @@ export interface ReactiveEffect<T = any> {
   active: boolean
   raw: () => T
   deps: Array<Dep>
-  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<T = any>(
 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<T = any>(
   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()
   }
index 4490d20196dd42713f169e5176a1dcc7e130e82e..ca3b7843c9d4d5a2fec05392e96fd5353bf1e4f0 100644 (file)
@@ -27,10 +27,12 @@ export type ComponentObjectPropsOptions<P = Data> = {
 
 export type Prop<T> = PropOptions<T> | PropType<T>
 
+type DefaultFactory<T> = () => T | null | undefined
+
 interface PropOptions<T = any> {
   type?: PropType<T> | true | null
   required?: boolean
-  default?: T | null | undefined | (() => T | null | undefined)
+  default?: T | DefaultFactory<T> | null | undefined
   validator?(value: unknown): boolean
 }