做者:Wang Namelos
连接:https://www.zhihu.com/questio...
来源:知乎 react
解答这个问题并不困难:惟一的要求是你熟悉React。
不要光听别人描述名词,理解起来是很困难的。redux
从需求出发,看看使用React须要什么:api
- React有props和state: props意味着父级分发下来的属性,state意味着组件内部能够自行管理的状态,而且整个React没有数据向上回溯的能力,也就是说数据只能单向向下分发,或者自行内部消化。理解这个是理解React和Redux的前提。
- 通常构建的React组件内部多是一个完整的应用,它本身工做良好,你能够经过属性做为API控制它。可是更多的时候发现React根本没法让两个组件互相交流,使用对方的数据。
- 而后这时候不经过DOM沟通(也就是React体制内)解决的惟一办法就是提高state,将state放到共有的父组件中来管理,再做为props分发回子组件。
- 子组件改变父组件state的办法只能是经过onClick触发父组件声明好的回调,也就是父组件提早声明好函数或方法做为契约描述本身的state将如何变化,再将它一样做为属性交给子组件使用。
- 这样就出现了一个模式:数据老是单向从顶层向下分发的,可是只有子组件回调在概念上能够回到state顶层影响数据。这样state必定程度上是响应式的。
- 为了面临全部可能的扩展问题,最容易想到的办法就是把全部state集中放到全部组件顶层,而后分发给全部组件。
<!-- more -->数据结构
为了有更好的state管理,就须要一个库来做为更专业的顶层state分发给全部React应用,这就是Redux。让咱们回来看看重现上面结构的需求:app
- 须要回调通知state (等同于回调参数) -> action
- 须要根据回调处理 (等同于父级方法) -> reducer
- 须要state (等同于总状态) -> store
对Redux来讲只有这三个要素:ide
- action是纯声明式的数据结构,只提供事件的全部要素,不提供逻辑。
- reducer是一个匹配函数,action的发送是全局的:全部的reducer均可以捕捉到并匹配与本身相关与否,相关就拿走action中的要素进行逻辑处理,修改store中的状态,不相关就不对state作处理原样返回。
- store负责存储状态并能够被react api回调,发布action.
固然通常不会直接把两个库拿来用,还有一个binding叫react-redux, 提供一个Provider和connect。不少人其实看懂了redux卡在这里。函数
- Provider是一个普通组件,能够做为顶层app的分发点,它只须要store属性就能够了。它会将state分发给全部被connect的组件,无论它在哪里,被嵌套多少层。
- connect是真正的重点,它是一个柯里化函数,意思是先接受两个参数(数据绑定mapStateToProps和事件绑定mapDispatchToProps),再接受一个参数(将要绑定的组件自己):
- mapStateToProps:构建好Redux系统的时候,它会被自动初始化,可是你的React组件并不知道它的存在,所以你须要分拣出你须要的Redux状态,因此你须要绑定一个函数,它的参数是state,简单返回你关心的几个值。
mapDispatchToProps:声明好的action做为回调,也能够被注入到组件里,就是经过这个函数,它的参数是dispatch,经过redux的辅助方法bindActionCreator绑定全部action以及参数的dispatch,就能够做为属性在组件里面做为函数简单使用了,不须要手动dispatch。这个mapDispatchToProps是可选的,若是不传这个参数redux会简单把dispatch做为属性注入给组件,能够手动当作store.dispatch使用。这也是为何要科里化的缘由。spa
作好以上流程Redux和React就能够工做了。简单地说就是:事件
- 顶层分发状态,让React组件被动地渲染。
- 监听事件,事件有权利回到全部状态顶层影响状态。
更多分享关注:
ip