美文网首页让前端飞技术干货
React高级篇(二)Redux工作流(react-redux)

React高级篇(二)Redux工作流(react-redux)

作者: 娜姐聊前端 | 来源:发表于2018-11-05 21:31 被阅读14次

《React高级篇(一)从Flux到Redux,react-redux》文章中贴过一张redux单向数据流的图,但是,从action到reduer,其实还缺少了不少环节。

举个例子,如果发起一个异步动作(比如网络请求),该如何处理?redux单向数据流一定是同步的,碰上异步Action,必须将其转为同步Action,才可以继续走下去,否则事件会被丢失。

再比如,如果需要给每个Action都要打Log,那么,是否有个节点可以统一处理?

于是,store enhance(middleware是它的特殊实现)出现了,Action到达reducer之前,会经过一系列的enhancer处理看下图:

redux flow.png

复习:Store的创建方式

createStore(reducer, [preloadedState], [enhancer])

第三个参数即是enhancer

创建Store的enhancer

一个store对象中包含下列接口:

  • dispatch
  • subscribe
  • getState
  • replaceReducer

一般来说,自定义enhancer都是针对上述接口做能力增强,比如提供日志功能的logEnhancer,定义如下:

const logEnhancer = (createStore)  =>  (reducer,  preloadedState,  enhancer) =>  (
    const store= createStore(reducer,  preloadedState,  enhancer);
    const originalDispatch = store.dispatch;
    store.dispatch = (action) =>  {
        console.log('dispatch action:’,action);
        originalDispatch(action);
        return store;
};

增强器通常都使用这样的模式,将store上某个函数的引用存下来,给这个函数一个新的实现,但是在完成增强功能之后,还是要调用原有的函数,保持原有的功能。

store enhancer和middleware的关系?

middleware本身就是一个store enhancer,它专门负责增强redux.dispatch()方法。middleware源码示意如下:

export default function middleware(...middlewares) {
    return createStore => (...args) => 
        { // 省略 return { ...store, dispatch }
    }
}

注意:middleware应该置于enhancer队列的最前排。
常用的middleware是处理异步请求的redux-thunk。
对于异步工作流,一定要用dispatch函数派发,而不是使用next函数,这样,异步工作流才可以被所有中间件处理,否则,它只能被当前位置之后的中间件处理。

后记

讲redux-thunk相关的文章非常多,不再累述。

参考文章:浅析Redux 的 store enhancer,书籍-《深入浅出react和redux》

相关文章

网友评论

    本文标题:React高级篇(二)Redux工作流(react-redux)

    本文链接:https://www.haomeiwen.com/subject/xbeexqtx.html