Evan You 7 лет назад
Родитель
Сommit
39e1fffb9c
1 измененных файлов с 11 добавлено и 4 удалено
  1. 11 4
      packages/observer/src/computed.ts

+ 11 - 4
packages/observer/src/computed.ts

@@ -7,13 +7,13 @@ export interface ComputedValue<T> {
   readonly effect: ReactiveEffect
   readonly effect: ReactiveEffect
 }
 }
 
 
-export function computed<T, C = null>(
-  getter: (this: C, ctx: C) => T,
-  context?: C
+export function computed<T>(
+  getter: () => T,
+  setter?: (v: T) => void
 ): ComputedValue<T> {
 ): ComputedValue<T> {
   let dirty: boolean = true
   let dirty: boolean = true
   let value: any = undefined
   let value: any = undefined
-  const runner = effect(() => getter.call(context, context), {
+  const runner = effect(getter, {
     lazy: true,
     lazy: true,
     // mark effect as computed so that it gets priority during trigger
     // mark effect as computed so that it gets priority during trigger
     computed: true,
     computed: true,
@@ -34,6 +34,13 @@ export function computed<T, C = null>(
       // This should also apply for chained computed properties.
       // This should also apply for chained computed properties.
       trackChildRun(runner)
       trackChildRun(runner)
       return value
       return value
+    },
+    set value(newValue) {
+      if (setter) {
+        setter(newValue)
+      } else {
+        // TODO warn attempting to mutate readonly computed value
+      }
     }
     }
   }
   }
   knownValues.add(computedValue)
   knownValues.add(computedValue)