模型(model)

模型就是一些状态和一组操作的集合。再直接一点,模型就是redux的一颗状态子树和操作这些状态的同步和异步操作的集合。

状态(state)

模型中的状态通常就是一个js对象,每个模型的状态都会根据模型名称挂载在redux的单一状态树上。state对象是不可变的,通常不能直接对它赋值。

在模型的reducer和effect函数中,可以通过this获取到模型的state

@reducer()
add() {
    console.log(this.state);
}

每个模型的状态必须有初始值,可以通过init注解注入。

@init({
    state: {
        count: 0
    }
})
export default class AppModel extends Model {
}

reducer

就是redux的reducer函数,但是形式上有一些区别。resa会在注册模型的时候将reducer注入到redux中。

这是redux的reducer, 接受参数state和action, 一般要判断一下这个action.type是不是需要处理的类型。

function todoApp(state, action) {
  return state
}

这是resa模型中的reducer, state从this中获取,没有action参数,resa会帮你判断action.type,并且直接注入redcuer所需要的参数。

@reducer()
add(count: number) {
    return {
        count: this.state.count + count
    };
}

在reducer中,直接返回修改的对象即可,无需像redux的reducer那样要返回所有state,resa会处理合并。

effect

effect就是redux-saga的saga函数,在resa中,effect就是异步处理函数。经过saga的加持,effect可以随心所欲的发起请求、控制异步操作。effect不能直接修改状态,只能通过调用reducer修改状态。resa内部提供了一个内置的reducer: this.fulfilled,这样你就不用为每个effect都创建一个reducer。

@effect()
* addAsync(count: number) {
    yield delay(2000);

    this.add(count); // 调用我们定义reducer
    // or 调用内置的reducer
    this.fulfilled({
        count: this.state.count + count.00001
    });
}

this.fulfilled是一个内置的reducer,参数为修改的对象。

effect的默认saga Helper为takeEvery, 可以传递参数给effect修改默认的saga Helper,目前支持四种:takeEvery、takeLatest、throttle(effect第二个参数为时间ms)、takeFirst。

effect('throttle', 1000)

名称(name)

resa中模型名称必须唯一,你可以在init注解中传递模型名称。默认的模型名称为类名。

@init({
    name: 'appModel',
    state: {
        count: 0
    }
})

results matching ""

    No results matching ""