Skip to content

关于

同步计算属性直接声明在状态中,本质上是一个普通的函数,,当State中的数据变化时,会自动触发计算属性的重新计算,将计算结果赋值给State中的对应属性。

创建方式

快速创建

可以直接在State中声明普通同步计算函数。

ts
import { createStore } from '@autostorejs/react';
const state = createStore({
  user:{
    firstName:"Zhang",
    lastName:"Fisher",
    fullName: (user)=>{
      return user.firstName+user.lastName
    } 
  }
})
  • fullName是一个同步计算属性,依赖于firstNamelastName,当firstNamelastName变化时,会自动重新计算fullName的值。
  • fullName的第一个参数(即作用域)是由createStore时指定的scope指定的,默认指定的ObserverScopeRef.Current。因此,fullName的第一个参数是user对象。
  • 如果同步计算函数是一个普通函数而不是箭头函数,那么this指向是根据当前计算属性创建的computedObject对象,详见计算对象
  • 同步计算属性的依赖收集是自动的,无需手动指定依赖。

使用computed

创建同步计算属性的标准方式是computed(<getter>,<options>)函数,通过为computed指定options来进行一些更灵活的控制计算属性的行为。

ts
const state = {
  user:{
    firstName:"Zhang",
    lastName:"Fisher",
    fullName:computed<string>((state)=>{
      return state.user.firstName+state.user.lastName
    },{ 
      scope:ObserverScopeRef.Root               // 计算函数的第一个参数
    }) 
  }
}

由于可以指定computedScope,因此计算函数就可以实现相对计算。

  • 在上面的例子,计算订单的小计只需要 {...,total:(book)=>book.price*book.count}即可计算出小计,看起来非常简洁。

配置参数

使用computed(<getter>,<options>)创建同步计算属性时,可以指定以下参数:

参数 类型 默认值 说明
id string 计算属性的唯一标识,用于在computedObjects中查找计算属性对象。
scope ObserverScopeRef ObserverScopeRef.Current 计算函数的第一个参数,即作用域
group string 用于计算属性对象进行分组,可以computedObjects.runGroup(name)来运行一组计算属性。
objectify boolean true 是否将计算属性对象保存在store.computedObjects