Redux的中间件applyMiddleware解析 #76
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
最近在阅读
redux
的源码,觉得十分的精妙,但是也看出了自己对Typescript
的理解还不到位其中中间件部分的代码,第一次让我感觉到了心灵的冲击,原来代码可以这么的精巧绝伦
以前自己封装过一个简单的请求方法,中间件的实现就low的不谈了,创建一个前置中间件的数组,再创建一个后置中间件的数组,请求前遍历掉用前置数组,请求后遍历掉用后置数组,真的捞的淌口水
redux的中间件实现
先来看看源码,为了看上去直观一点,我把
ts
的类型给去掉了这个
applyMiddleware
函数接受不定参数的函数作为参数,返回一个新的函数,这个新的函数会接受createStore
函数作为参数使用了
applyMiddleware
函数后,redux
的createStore
创建store
就移交给applyMiddleware
函数处理了中间件函数接受的参数是
dispatch
和getState
函数,并且返回一个新的函数来看看中间件函数应该怎么写
这里的
middlewareApi
就是下面这段传入的dispatch
函数和getState
函数这里对所有中间件传了
dispatch
和getState
,中间件返回的新函数里,可以闭包使用这两个函数其实中间件的实现,只用了一行代码
重点就在于这个
compose
函数compose函数
这个函数作用简单来讲,就是把单参数函数从右到左嵌套调用
举个例子
一步一步解析,这里有3个函数,所以
reduce
会遍历2次第一次
第二次
以此类推
这只是简单的一个示例,实际上需要更复杂的例子才能理解
redux
是如何实现中间件的从代码理解
先实现一个简单的中间件功能
结果还是符合预期的
其实我觉得比较难理解的地方,是在中间件函数又返回了一个新的函数这里
这个
next
,就是接受到的参数,next
必须是一个函数,因为需要嵌套的调用如果把示例的代码平铺开来,应该是这样的
这样就一目了然了,从A函数开始,A函数接收了
action
参数,在调用next
参数的时候,将action
传入,这个next
就是A函数接收的参数,也就是B函数返回的新函数,在B函数里又调用了next
函数,因为只有两个中间件,所以这里的next
就是handle
函数中间件的思路理清楚后,再看
redux
的中间件就很清楚了,它的中间件又额外接收一个参数middlewareAPI
返回了个新函数,让中间件函数拥有dispatch
和getState
的能力当我明白了这个原理后,我再看见
redux-thunk
的源码只有十行的时候,已经在预期之中了redux-thunk
的简单实现当
action
是函数的时候,将dispatch
和getState
传入,原理就是这么简单不过似乎中间件还有中间件,就像
composeWithDevTools(applyMiddleware(thunk, logger))
这样,用了浏览器的redux-dev-tool
,又对applyMiddleware
中间件再来了一次中间件redux
的源码,简直是闭包的典范,几乎全是闭包,我觉得写的是相当的牛皮了,中间件的实现简直是精妙绝伦macbook居然自己烧焦了,迷醉,不得不承认,没有mac的日子很难受,已经有点不习惯windows了……
Beta Was this translation helpful? Give feedback.
All reactions