Duck
Duck是所有duck的基类
constructor(options)
options支持以下参数,所有都为可选,常用参数加粗展示。
参数名 | 类型 | 描述 | 示例 |
---|---|---|---|
namespace | String | 名字空间,会作为actionType的前缀 | "global" |
route | String | 对应Redux store的位置,会作为actionType的前缀,用户无需指定,DuckMap会自动传递 | "counter1" |
selector | function(globalState){ return localState } | 当前duck对应Redux store位置的selector。通常无需定义,会自动从options.route生成。 | state => state.counter1 |
typeList | String[] | actionType列表,通过duck.types.INC访问 | [ "INC" ] |
types | enum{ [type]: string } | actionType在typescript下可以直接传递enum类型,与typeList二选一 | enum Types{ } |
reducer | (state, action, duck) => newState | 单独reducer | (state=0, action, duck) => state+1 |
reducers | duck => { [key]: reducer } | 最终会通过combineReducers合并为reducer | duck => ({ num: (state, action) => state+1 }) |
selectors | { [key]: selector } | 值选择器,selector传入当前duck的state,返回计算结果。selector内的this指向selectors配置,可以调用其它selector。 | { num: state => state.num } |
creators | duck => { [key]: creator } | actionCreators | duck => ({ inc: () => ({type: duck.types.INC}) }) |
sagas | saga[] | saga列表,执行时会从传入duck作为参数 | [ function*(duck){ yield select(duck.selectors.num) } ] |
Duck.prototype.init
供Duck扩展时使用,见Duck.prototype.extend
Duck.prototype.extend
供Duck扩展时使用
class ExampleDuck extends Duck{
init(){
super.init();
this.extend({
types: {...},
reducers: duck=>({...}),
...
})
}
}
Duck.prototype.types
根据options.typeList生成,示例:
const duck = new Duck({ typeList: ['ADD', 'SUB'] })
// typescript
// enum Types{ ADD, SUB }
// new Duck({ types: Types })
console.log(duck.types.ADD) // "global//ADD"
console.log(duck.types.SUB) // "global//SUB"
Duck.prototype.reducer
根据options.reducer和options.reducers生成最终reducer,使用DuckRuntime时无需访问此属性。
Duck.prototype.selector
根据options.selector或options.route生成,可以从Redux store的全局state取到当前duck层级的state
const myState = duck.selector(store) // 此处store为Redux store的全局state,而不是store实例
Duck.prototype.selectors
根据options.selectors生成,已经经过duck.selector包装,可直接从全局state取到当前duck下对应的值
const num = duck.selectors.num(store)
Duck.prototype.localSelectors
同options.selectors,不与duck.selectors的区别在于,它没有经过duck.selector的包装,方便进行组合使用
const num = duck.localSelectors.num(duck.selector(store))
Duck.prototype.creators
根据options.creators生成,是最终的actionCreator map
dispatch(duck.creators.inc())
Duck.prototype.options
最终合并后的options,可以用来访问外界传递的自定义属性