Skip to content

计算选项

关于

无论是同步或异步计算属性均推荐使用computed函数来声明。

computed函数支持ComputedOptions配置参数,可以通过配置参数来控制计算属性的行为。

computed是一个函数,用于声明一个计算属性,其函数签名声明如下:

ts
// 声明异步计算属性
function computed<Value = any, Scope = any>(
    getter: AsyncComputedGetter<Value,Scope>,
    depends: ComputedDepends,
    options?: ComputedOptions<Value,Scope>
): ComputedDescriptorBuilder<Value,Scope>;
// 同步计算属性
function computed<Value = any, Scope = any >(
    getter: ComputedGetter<Value,Scope>,
    options?: SyncComputedOptions<Value,Scope>
): ComputedDescriptorBuilder<Value,Scope>;

选项

computed支持以下计算配置参数:

id

类型string

创建计算属性对象ComputedObject时唯一标识,如果未指定

  • 使用computed所在的路径名作为标识,如user.fullName
  • 动态创建的ComputedObject会自动生成一个唯一标识。

当然,您也可以通过id参数来指定唯一标识。

immediate

类型boolean | 'auto' 默认值'auto'

针对异步计算属性是否在初始化时立刻运行一次计算函数getter.取值如下:

说明
true 在创建异步计算时马上执行一次
false 在创建异步计算时不马上执行一次,后续仅在依赖变化时执行
auto initial==undefined时会马上执行一次,其他值则不马上执行一次

initial

类型:可以通过泛型参数指定Value 默认值:undefined

作为计算属性的初始值。

scope

类型ComputedScope 默认值: Current

指定计算函数的第一个参数,如果未指定,则默认为Current。详见ComputedScope

enable

类型boolean 默认值true

计算开关,当enable=false时不会执行计算。 也可以通过store.computedObjects.get(<id>).enable=<true/false>来统一控制计算属性的开关。

async

类型boolean 默认值undefined

默认情况下,computed函数会通过typeof(fn)=="async function"来判断是否是异步计算函数,以决定如何创建同步或异步计算属性。 但是在返回Promise或者Babel转码等情况下,判断会失效时,需要手动指定async=true

depends

类型ComputedDepends

必填依赖项,用于异步计算属性指定的依赖项。详见ComputedDepends

group

类型string

用于将计算属性分组,便于管理。比如可以通过store.computedObjects.runGroup("a"])来运行指定分组的计算函数。

参考手工运行

objectify

类型boolean 默认值true

是否将创建的computedObject对象保存到store.computedObjects中。 将objectify=false,在React组件中动态创建计算属性时,不将计算属性保存到store.computedObjects中。以便在组件销毁时自动释放。

timeout

类型number | [number,number] 默认值0

用来控制异步函数执行的超时。

  • 指定超时时间,当计算函数执行超过指定时间后,会触发超时错误。
  • 如果timeout=[超时时间,倒计时间隔], 例如:[1000,10]表示1000ms超时,每隔100ms更新一下timeout值,实现倒计时的效果。

详见超时处理

noReentry

类型boolean 默认值false

计算函数不可重入,即同一个计算函数在执行过程中,不会再次执行.

abortController

类型()=>AbortController | undefine

提供一个自定义的AbortController用来替代默认的AbortController,用来传递给异步计算函数以便可以取消异步计算.

详见异步计算-取消

retry

类型number 默认值0

用来控制异步计算失败后重试次数。

  • 默认retry=0代表不启用重试控制。
  • retry=3表示最多重试3次,重试间隔为0,加上第1次执行,总共执行4
  • retry=[3,1000]表示最多重试3次,重试间隔为1000ms,加上第1次执行,总共执行4
  • 重试数据可以通过AsyncComputedValue.retry获取
  • 当首次执行失败时触发重试,此时AsyncComputedValue.retry=3,然后每次重试-1,直到为0时停止重试

详见重试处理

extras

类型any

额外参数,用于传递给计算函数。在计算函数中可以通过extras参数获取。

ts
import { createStore,computed } from '@autostorejs/react';
const store = createStore({
    firstName:"Zhang",
    lastName:"Fisher",
    fullName: computed(async (user,{extras})=>{
      // 通过extras获取额外参数
      return user.firstName+user.lastName + `${count}`
    },["./firstName","./lastName"],{extras:{count:0}})
  }
})

onError

类型(error:Error)=>void

当执行计算getter函数出错时的回调

onDone

类型(args:{id:string,error:Error | undefined,timeout:boolean ,abort:boolean ,path:string[] | undefined,scope:Scope,value:any}):void

当计算函数执行完成时的回调

重载选项

当使用<AsyncComputedValue>.run(<RuntimeComputedOptions>)store.computedObjects.run(<RuntimeComputedOptions>)手动运行计算函数时,允许对部分选项进行重载覆盖。

ts
type RuntimeComputedOptions = ComputedOptions & {
    first?  : boolean                           // 当第一次运行时为true
    operate?: StateOperate                // 变化的依赖信息
}

注意

  • 调用run方法手动执行计算函数时允许重载部分选项,但不允许重载iddependsscope等关键选项。
  • 计算选项的重载仅在当前运行时有效,不会影响声明时的配置。