闲絮:
这个图片特别好,十分的有感触。
此时此刻儿子呼唤着我:“爸爸,上来睡觉。”
我安抚了一下告诉他,爸爸还有篇文章要写,你先睡。
多么温馨的画面,庆为人父。
前言:
今天给大家带来的是Redux的扩展,啥?这玩意还可以扩展吗?
是的,还很溜,我们一起看看吧!
正文:
章节:《深入浅出React和Redux》(第九章:扩展Redux)
1.Redux本身提供了很强大的数据流管理功能,但是Redux更强大之处在于它提供了扩展自身功能的可能性。
2.两种扩展Redux的方法:
A:中间件
B:Store Enhancer
3.在Express框架中,中间件是一些函数,用于定制对特定请求的处理过程。作为中间件的函数互相是独立的,可以提供对记录日志、返回特定响应报头、压缩等等请求的处理操作,中间件这种架构设计使得可以重用通用逻辑,通过组合不同中间件可以完成复杂功能
4.Redux和Express是两种功能不同的框架,中间件的概念也不完全一样,但是两者也有一些共同之处,如果把Redux和Express都看做一个对请求的处理框架的话,那么Redux中的action对象对应于Express中的客户端请求,而所有的中间件就组成处理请求的“管道”
5.中间件的特定
A:中间件是独立的函数
B:中间件可以组合使用
C:中间件有一个统一的接口
6.所谓中间件是独立的函数,指的是中间件之间不应该有依赖关系,每个中间件应该能够独立被一个Redux Store使用,完成某一个特定功能
7.正因为每个中间件只完成某一个特定功能,所以为了满足比较丰富的应用需求,应该能够在一个Redux Store上组合使用多个中间件。这些中间件按照指定顺序依次处理传入的action,只有排在前面的中间件完成任务之后,后面的中间件才有机会继续处理action,当然,每个中间件都可以中断对于某个action的“管道”,也就是不用后面的中间件继续处理了。
8.不同中间件之所以能够组合使用,是因为Redux要求所有中间件必须提供统一的接口,每个中间件的实现逻辑都不一样,但是只有遵守统一的接口才能够和Redux和其他中间件对话
9.以action为参数的函数对传入的action对象进行处理,因为JavaScript支持闭包(Clousure),在这个函数里可以访问上面两层函数的参数,所以可以根据需要做很多事情,包括以下功能
A:调用dispatch派发出一个新action对象
B:调用getState获得当前Redux Store上的状态
C:调用next告诉Redux当前中间件工作完毕,让Redux调用下一个中间件
D:访问action对象action上的所有数据
具有上面这些功能,一个中间件足够获取Store上的所有信息,也具有足够能力控制数据的流转
10.如果按照上面这种方法定义中间件接口,似乎更容易理解,但是Redux并没有这么设计,因为Redux是根据函数式编程(Functional Programming)的思想来设计的,函数式编程的一个重要思想就是让每个函数的功能尽量小,然后通过函数的嵌套组合来实现复杂功能。
11.使用中间件有两种方法,两种方法都离不开Redux提供的applyMiddleware函数。
12.第一种方法是用Redux提供的applyMiddleware来包装createStore产生一个新的创建Store的函数。
13.为了使用thunkMiddleware,将thunkMiddleware作为参数传递给applyMiddleware,产生了一个新的函数,新产生的函数实际上是一个Store Enhancer(很快就会介绍到Store Enhancer,在这里只需要理解Store Enhancer是一种能够增强Store功能的函数就行),这个Store Enhancer函数又将Redux的createStore作为参数,产生了一个加强版的创造store的函数,习惯上将这个增强的createStore命名为configureStore,利用configure-Store创造的Store将具有thunkMiddleware中间件的功能
14.对于没有使用其他Store Enhancer的场景,上述的方法还可以一用,但是实际中应用基本都会需要其他Store Enhancer的辅助,比如便于Redux开发的Redux Devtoos增强器,在有其他增强器出现的情况下,再用这种方法就显得很不方便了,所以上面介绍的第一种方法现在很少使用了,取而代之的是第二种方法
15.第二种方法也就是把applyMiddleware的结果当做Store Enhancer,和其他Enhancer混合之后作为createStore参数传入
16.createStore最多可以接受三个参数,第一个参数是reducer,第二个参数如果是对象,就会被认为是创建Store饿初始状态,这样第三个参数如果存在就是增强器。但如果第二个参数是函数类型,那就认为没有初始状态,直接把第二个参数当做增强器处理。
17.值得一提的是,使用这种方法应用中间件的时候,一定要把applyMiddleware的结果来作为compose的第一个参数,也就是要放在所有其他Store Enhancer之前应用
18.理解中间件饿最好办法就是自己开发一个中间件
19.开发一个Redux中间件,首先要明确这个中间件的目的,因为中间件可以组合使用,所以不要让一个中间件的内容太过于臃肿,尽量让一个中间件只完成一个功能,通过中间件的组合来完成丰富的功能
20.每个中间件必须是独立存在的,但是要考虑到其他中间件的存在
21.所谓独立存在,指的是中间件不依赖于和其他中间件的顺序,也就是不应该要求其他中间件必须出现在它前面或者后面,否则事情会复杂化
22.所谓考虑到其他中间件的存在,指的是每个中间件都要假设应用可能包含多个中间件,尊重其他中间件可能存在的事实。当发现传入的action对象不是自己感兴趣的类型,或者对action对象已经完成必要处理的时候,要通过调用next(action)将action对象交回给中间件管道,让下一个中间件有机会来完成自己的工作,千万不能不明不白地丢弃一个action对象,这样处理“管道”就断了
23.对于异步动作中间件,等于是要“吞噬”掉某些类型的action对象,这样的action对象不会交还给管道,不过,中间件会异步产生新的action对象,这时候不能够通过next函数将action对象还给管道了,因为next不会让action被所有中间件处理,而是从当前中间件之后的“管道”位置开始被处理
24.一个中间件如果产生了新的action对象,正确的方式是使用dispatch函数派发,而不是使用next函数
25.中间件可以用来增强Redux Store的dispatch方法,但也仅限于dispatch方法,也就是从dispatch函数调用到action对象被reducer处理这个过程中的操作,如果想要对Redux Store进行更深层次的增强定制,就需要使用Store Enhancer。
26.在前面的章节我们看到,applyMiddleware函数的返回值被作为增强器传入createStore,所以其实中间件功能就是利用增强器来实现的,毕竟定制dispatch只是Store Enhancer所能带来的改进可能之一,利用Store Enhancer可以增强Redux Store的各个方面
27.Redux提供的创建Store的函数叫createStore,这个函数除了可以接受reducer和初始状态(preloadedState)参数,还可以接受一个Store Enhancer作为参数,Store Enhancer是一个函数,这个函数接受一个createStore模样的函数为参数,返回一个新的createStore函数。
28.上面的例子中,最里层的函数体可以拿到一个createStore函数对象还有应该传递给这个createStore函数对象的三个参数,所以,基本的套路就是利用所给的参数创造出一个store对象,然后定制store对象,最后把store对象返回去就可以
29.实现一个Store Enhancer,功夫全在于如何定制产生的store对象,一个store对象中包含下列接口
A:dispatch
B:subscribe
C:getState
D:replaceReducer
30.增强器通常都使用这样的模式,将store上某个函数的引用存下来,给这个函数一个新的实现,但是在完成增强功能之后,还是要调用原有的函数,保持原有的功能。在上例中,我们想要增强dispatch函数,先把store.dispatch的实现存在originalDispatch变量中,这样在新的dispatch函数中就可以调用,保证不破坏Redux Store的默认功能了。
31.Redux的store上有一个replaceReducer函数,可以帮助我们完成替换reducer的工作,但是store只有getState,可并没有replaceReducer。Redux这样设计就是杜绝对state的直接修改,我们都知道改变一个Redux Store状态的只能通过reducer,而驱动reducer就要派发一个action对象
32.Store Enhancer的功能比中间件更加强大,它完全可以定制一个store对象的所有接口,我们通过一个增强器实例演示了重置store上reducer和状态的功能
观后感回放:
粉丝路人甲:“太感人了,你不多陪陪儿子吗,今天少写一篇不要紧的”
锵哥:“要教会儿子坚持,那自己必须做到坚持”
粉丝路人甲:“嗯,原来如此!”
广告:
本人从事全栈工程师,目前主要工作能力涵盖的范围有:android,ios,h5,pcWeb,react,vue,node,java服务端,微信服务号,微信小程序,支付宝生活号,支付宝小程序。
本公众号会不定期的将自己的研发感悟,以及心得笔记无私奉献给大家。还等啥,赶快上车吧,铁子们!!!?(还会有其他的福利哦!快来吧)
官方订阅号:锵哥的觉悟
微信号:DY_suixincq
二维码:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。