]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: make computed implementation consistent
authorEvan You <yyx990803@gmail.com>
Tue, 20 Aug 2019 13:45:28 +0000 (09:45 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 20 Aug 2019 13:45:28 +0000 (09:45 -0400)
packages/reactivity/src/computed.ts
packages/reactivity/src/index.ts
packages/runtime-core/src/apiReactivity.ts

index 5cbd1b5a2c37b7fa6370f9885be081676ced7871..ef6e17c138d34ab5b5550fe28026e837b24a1413 100644 (file)
@@ -1,17 +1,29 @@
 import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect'
 import { UnwrapNestedRefs, knownRefs } from './ref'
+import { isFunction } from '@vue/shared'
 
 export interface ComputedRef<T> {
   readonly value: UnwrapNestedRefs<T>
   readonly effect: ReactiveEffect
 }
 
+export interface ComputedOptions<T> {
+  get: () => T
+  set: (v: T) => void
+}
+
 export function computed<T>(
-  getter: () => T,
-  setter?: (v: T) => void
+  getterOrOptions: (() => T) | ComputedOptions<T>
 ): ComputedRef<T> {
+  const isReadonly = isFunction(getterOrOptions)
+  const getter = isReadonly
+    ? (getterOrOptions as (() => T))
+    : (getterOrOptions as ComputedOptions<T>).get
+  const setter = isReadonly ? null : (getterOrOptions as ComputedOptions<T>).set
+
   let dirty: boolean = true
   let value: any = undefined
+
   const runner = effect(getter, {
     lazy: true,
     // mark effect as computed so that it gets priority during trigger
index 99112a94cac1360a74fca782dcc2de01c65cfa66..71893f636512d63dc53b1bd2bd2ca6477d01f008 100644 (file)
@@ -8,7 +8,7 @@ export {
   markImmutable,
   markNonReactive
 } from './reactive'
-export { computed, ComputedRef } from './computed'
+export { computed, ComputedRef, ComputedOptions } from './computed'
 export {
   effect,
   stop,
index 327cc38527aff7d790557b6e350a9a9e70cb40ca..fa67f54cbbd8113b332c09c6f3017407075ffcdc 100644 (file)
@@ -23,11 +23,11 @@ export {
 import {
   computed as _computed,
   ComputedRef,
+  ComputedOptions,
   ReactiveEffect
 } from '@vue/reactivity'
 
 import { currentInstance } from './component'
-import { isFunction } from '@vue/shared'
 
 // record effects created during a component's setup() so that they can be
 // stopped when the component unmounts
@@ -37,20 +37,10 @@ export function recordEffect(effect: ReactiveEffect) {
   }
 }
 
-interface ComputedOptions<T> {
-  get: () => T
-  set: (v: T) => void
-}
-
 export function computed<T>(
   getterOrOptions: (() => T) | ComputedOptions<T>
 ): ComputedRef<T> {
-  let c: ComputedRef<T>
-  if (isFunction(getterOrOptions)) {
-    c = _computed(getterOrOptions)
-  } else {
-    c = _computed(getterOrOptions.get, getterOrOptions.set)
-  }
+  const c = _computed(getterOrOptions)
   recordEffect(c.effect)
   return c
 }