redux-promiseMiddleware的最佳实践
redux-promise-middleware 概述我们之前关于中间件已经有做过讨论。关于 const foo = () => ({ type: 'FOO',payload: new Promise() }) 中间件会立即触发一个 { type: 'FOO_PENDING' } 等 { type: 'FOO_FULFILLED' payload: { ... } } { type: 'FOO_REJECTED' payload: { ... } } 实现原理关于它的源码,其实比较容易理解,就是判断了一下 if (action.payload) { if (!isPromise(action.payload) && !isPromise(action.payload.promise)) { return next(action); } } else { return next(action); } 如果是 next({ type: [type,_PENDING].join(promiseTypeSeparator),...(data !== undefined ? { payload: data } : {}),...(meta !== undefined ? { meta } : {}) }); 然后等待这个 实践分析实践中,几乎每一个异步操作都有必要增加它乐观更新的能力,哪怕是一个简单的 但是为了在 switch (action.type) { case 'MY_ACTION_TYPE_PENDING': return {...state,myActionLoading: true} case 'MY_ACTION_TYPE_FULFILLED': return {...state,xxx,myActionLoading: false} case 'MY_ACTION_TYPE_REJECTED': return {...state,myActionLoading: false} } 我们写了很多这种重复的代码去做这种相同的事情,既然我们每一个 假如我们专门声明一个 // reducer 类似如下 // STATEMACHINE 指的是对应特殊事件的 `action's type` import { STATEMACHINE } from 'redux-promise-middleware' const uiStateStore = (state = {},action) => { switch (action.type) { case STATEMACHINE: { let { actionType,isFetching } = action return { ...state,[actionType]: isFetching } } default: return state } } <Button loading={this.props.isLoading} /> ... const mapStateToProps = state => ({ ...,isLoading: state.uiState.MY_ACTION_TYPE }) 效果如下
可以在项目 react-ggsddu 运行 博客地址 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |