Redux的中间件Middleware不难,我信了^_^

 Redux的action和reducer已经足够复杂了,现在还需要理解Redux的中间件。为什么Redux的存在有何意义?为什么Redux的中间件有这么多层的函数返回?Redux的中间件究竟是如何工作的?本文来给你解惑,Redux中间件从零到“放弃”。

本文的参考网站只有二个,首当其冲的就是Redux的官方网站,本文的思考过程大多参考官方给出的例子。还有一个就是Redux的经典中间件,可以说Redux的中间件的产生就是为了实现它——redux-thunk

写在前面:本文其实就是我理解Redux中间件的一个思考过程,中间不免来自我个人的吐槽,大家看看乐乐就好。

我们为什么要用中间件?

我们为什么要用中间件?这个问题提的好!为了回答这个问题,我现在提出一个需求,所有的store.dispatch都要监控dispatch之前和之后的state变化。那么我们会怎做呢?So easy,直接前后都加上console.log(store.getState())就可以了不是吗?

console.log('dispatching', action) store.dispatch(getTodos({items:[]})) console.log('next state', store.getState()) console.log('dispatching', action) store.dispatch(getTodos({items:["aaa"]})) console.log('next state', store.getState())

没错,我们可以这么做。不过如果夸张点,我有成千上万的dispatch,那么console.log就要dispatch的数量*2了。然后当我们幸幸苦苦打完点,产品要上线了,我们需要把断点都关闭。这个时候难道我们要一个个去注释删除吗?

不,我不干,这样可能还会改错。那么我们将此功能独立出来试试,这样不就可以实现复用了。将公用代码写入一个方法,然后变化的参数提取出来。

function dispatchAndLog(store, action) {     console.log('dispatching', action)     store.dispatch(action)     console.log('next state', store.getState()) } dispatchAndLog(store, getTodos({items:[]})) dispatchAndLog(store, getTodos({items:["aaa"]}))

这样是不是就方便了很多,注释的话只需要注释两行,而不是随着dispatch成倍数增长。但是我觉得这样写,对于其他合作的小伙伴不友好,相当于我自己写了一套语法出来。最好还是使用官方的store.dispatch的时候,自定义函数一起执行了。

可以这样改写store.dispatch,将store.dispatch赋值给next,然后将diapatch变成我们自定义的函数,在这个自定义的函数中调用next,也就是原dispatch。这样就玩美地改写了dispatch,保留了原始功能,还添加了自定义的方法。

const next = store.dispatch store.dispatch = function dispatchAndLog(action) {   console.log('dispatching', action)   let result = next(action)   console.log('next state', store.getState())   return result }

锵锵锵~~~这个时候Redux中间件的雏形就出现了。

MiddleWare就是对dispatch方法的一个改造,一个变异。

多中间件的实现

那么假象一下,我不仅需要监控state,我可能还有其他的功能。而且与监控state的方法相互独立。也就是我需要多个中间件,那么该如何实现呢?

我们可以将每次的变异

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信