useDuck
使用hook的方式快速在组件中使用Duck
Copy import { useDuck , Duck } from 'saga-duck'
function MyComponent (){
const { duck , store , dispatch } = useDuck (Counter)
const { selector , creators } = duck
return <>
Clicked : { selector (store).count} times
< button onClick = {() => dispatch (creators.increment())} >+ </ button >
</>
}
purify(FSC): DuckComponent
提供FSC的性能优化,更多可参考 进阶-FSC优化
Copy import { purify } from 'saga-duck'
export default purify ( function DuckComponent ({ duck , store , dispatch }){ ... })
memorize( (duck, dispatch)=>Mixed ): (instance|Props)=>Mixed
对于React16+,使用useMemo替代
提供仅基于duck与dispatch的持久化,用于固定例如回调等函数的实例,阻止重复渲染,优化性能。
更多可参考 进阶-其它通用的React优化
Copy import { memorize } from 'saga-duck'
const getHandler = memorize ((duck , dispatch) => () => dispatch ( duck . creators .bar ()) )
function Container (props){
const handler = gethandler (props)
return < Foo handler = {handler} />
}
asResult(selector, yield select(selector))
因为generator过于灵活,以至于typescript对redux-saga的支持并不好,我们无法取得yield select(selector)
正确的返回结果类型,这时可以使用asResult
工具方法,它不做任何操作 原样返回结果,供typescript正确识别返回类型。
Copy import { asResult } from 'saga-duck'
function* saga (k){
const myState = asResult ( this .selector , yield select ( this .selector))
// now myState is the type of duck.selector's return type
}
在经过实践后,不再推荐使用 (尽管它是redux-saga官方的推荐写法),而是直接用下面的方式,能直接取得类型信息
Copy const myState = this .selector ( yield select ())
reduceFromPayload / createToPayload
通常情况下,saga-duck中的大部分reducers及actionCreators都是极其简单并雷同的
Copy let reducer = (state = 0 , action) : number => {
switch ( action .type){
case types . SET_ID :
return action .payload
default :
return state
}
}
let creator = (id : number ) => ({ type : types . SET_ID , payload : id })
我们可以将它简化成这样
Copy import { reduceFromPayload , createToPayload } from 'saga-duck'
let reducer = reduceFromPayload ( types . SET_ID , 0 )
let creator = createToPayload < number >( types . SET_ID )