之前一直在探索反应相关的东西,手上有个温泉项目,于是准备上回来的试试水.Redux本身和反应并没有之间的关联,它是一个通用Javscript应用模块,用做应用程序状态的管理。要在反应的项目中使用回来的,比较好的方式是借助react-redux这个库来做连接,这里的意思是,并不是没有react-redux,这两个库就不弄一起用了,而是说react-redux提供了一些封装,一种更科学的代码组织方式,让我们更舒服地在反应的代码中使用回来的。
之前仅通过回来的文档来了解react-redux,在一段时间的实践后准备翻一翻源代码,顺便做些相关的总结。我看的代码的npm版本为v4.0.0,也就是说使用的反应版本是0.14.x。
react-redux提供两个关键模块:提供者和连接。
<强>供应商强>
提供者这个模块是作为整个应用的容器,在你原有容器的应用程序的基础上再包上一层,它的工作很简单,就是接受回来的的商店作为道具,并将其声明为背景的属性之一,子组件可以在声明了contextTypes之后可以方便的通过this.context.store访问到商店。不过我们的组件通常不需要这么做,将商店放在上下文里,是为了给下面的连接用的。
这个是提供者的使用示例:
//配置应用程序的根 const历史=createHistory () const根=( & lt;提供者存储键={商店}=疤峁┱摺北? & lt;路由器历史={}历史路线={路线}/比; & lt;/Provider> )//渲染 ReactDOM.render ( 根, . getelementbyid(根) ) >之前<强> 连接强>
这个模块是算是真正意义上连接了回来的和反应,正好它的名字也叫连接。
先考虑回来的是怎么运作的:首先存储中维护了一个状态,我们分派一个行动,接下来减速器根据这个行动更新状态。
映射到我们的反应应用中,商店中维护的状态就是我们的应用状态,一个反应组件作为视图层,做两件事:渲染和响应用户操作。于是连接就是将存储中的必要数据作为道具传递给反应组件来呈现,并包装行动造物主用于在响应用户操作时分派一个行动。
好了,详细看看连接这个模块做了什么,先从它的使用来说,它的API如下:
连接([mapStateToProps], [mapDispatchToProps], [mergeProps],[选项])mapStateToProps是一个函数,返回值表示的是需要合并进道具的状态。默认值为()=比;({}),即什么都不传。
(国家、道具)=比;({})//通常会省略第二个参数mapDispatchToProps是可以是一个函数,返回值表示的是需要合并仅道具的actionCreators,这里的actionCreator应该是已经被包装了派遣了的,推荐使用回来的的bindActionCreators函数。
(调度、道具)=比;({//通常会省略第二个参数 …bindActionCreators ({ ResourceActions… },调度) })更方便的是可以直接接受一个对象,此时联系函数内部会将其转变为函数,这个函数和上面那个例子是一模一样的。
mergeProps用于自定义合并流程,下面这个是默认流程,parentProps值的就是组件自身的道具,可以发现如果组件的道具上出现同名,会被覆盖。
(dispatchProps stateProps parentProps)=比;({ ……parentProps, ……stateProps, dispatchProps… })选项共有两个开关:纯代表是否打开优化,详细内容下面会提,默认为真的,withRef用来给包装在里面的组件一个裁判,可以通过getWrappedInstance方法来获取这个裁判,默认为假的。
连接返回一个函数,它接受一个反应组件的构造函数作为连接对象,最终返回连接好的组件构造函数。
然后几个问题:
<李>反应组件如何响应存储的变化?李> <李>为什么连接选择性的合并一些道具,而不是直接将整个州传入?李> <李>纯优化的是什么?李>
我们把连接返回的函数叫做连接器,它返回的是内部的一个叫连接的组件,它在包装原有组件的基础上,还在内部监听了回家的的商店的变化,为了让被它包装的组件可以响应存储的变化:
trySubscribe () { 如果(shouldSubscribe,,! this.unsubscribe) { 这一点。退订=this.store.subscribe (:: this.handleChange) this.handleChange () } } handleChange () { this.setState ({ storeState: this.store.getState () }) }浅谈反应和回来的的连接react-redux