实现 redux-thunk 中间件

回顾redux-thunk三方库使用方法:

redux-thunk这个中间件,可以让store的dispatch具备派发函数的能力。

1.我们在创建store的时候,先导入redux-thunk 和 applyMiddleware函数,然后创建store的时候将applyMiddleware(thunk)传入

image.png


2.编写action。 通过函数调用的形式返回action(注意这里返回的acion不再是对象,而是一个函数foo) image.png


3.在组件中调用dispatch派发第2步中创建的foo函数 image.png


自己实现thunk:

redux-thunk这个中间件做的事情无非就是当我们dispatch时,先进行一个拦截,看看我们派发的是对象还是函数,如果是派发了一个函数,这个函数会被自动调用,并传递dispatch函数store中存储的值 进去(即:上面的回顾redux-thunk三方库使用方法中的第2步的第14行代码)

所以如果让我们自己实现thunk中间件的话,我们需要拦截dispatch,因此我们可以替换到redux中的dispatch,当发生dispatch时,执行我们的自定义的dispatch方法,这样我们就可以对其进行拦截、并处理了。

image.png 第2行:注释掉使用redux-thunk中的thunk

第14行: 不使用redux-thunk中的thunk

第16-33行:自定义thunk函数中间件。 第18行:首先存储一下store中原本的dispatch函数。 第21行:自定义dispatch函数,用来替换原本的dispatch函数。 第32行:用自定义的dispatchThunk函数 替换 store中的dispatch方法。

第35行:执行一下自定义thunk函数中间件,让代码生效。


自定义的dispatchThunk函数实现思路:

1 通过观察store中原本的dispatch函数,该函数接受一个action作为参数,所以我们自定义的dispatchThunk函数,同样也接受一个action参数。

2 因为要支持派发函数,所以要对传入的action参数做判断,如果是function类型,就需要和使用redux-thunk一样,对传入的action函数进行调用,调用时还需要传入dispatch 和 store中存储的值(即:第23行)。 这里有个注意点:就是传入的dispatch是store.dispatch,也就是我们自定义的dispatchThunk函数, 而不是next函数(原本store中的dispatch)。这是因为我们不确定这个被调用的action函数中是否还会dispatch一个函数,如果你传递一个next函数出去,那么next函数是不能dispatch一个函数的。

看下图的例子:foo函数被调用,传递了dispatch进来,接着又执行了dispatch(function abc(){}) 派发了一个函数,如果传入的dispatch是store原本的那个dispatch,那么就不会支持派发函数了。所以要传入我们自定义的dispatchThunk函数。

image.png

如果是纯粹的对象类型,就直接调用next函数(即:store中原本的dispatch函数)进行action对象派发。

如果是其他类型,直接提示报错。

总结:其实就是dispatch派发foo函数的时候,要主动调用一下这个foo函数。并将dispatch作为参数,传给foo,传入dispatch的目的是当foo中的异步操作(网络请求)完成后得到返回值,再用传入的dispatch函数将返回值以对象的形式派发出去。


代码:

gitee.com/wangsn001/t…

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务