Redux名字的含义是Reducer+Flux。
1.Redux三个基本原则
Flux的基本原则是“单向数据流”, Redux在此基础上强调三个基本原则:
- 唯一数据源(Single Source of Truth)。唯一数据源指的是应用的状态数据应该只存储在唯一的一个Store上。
- 保持状态只读(State is read-only)。保持状态只读,就是说不能去直接修改状态,要修改Store的状态,必须要通过派发一个action对象完成,这一点,和Flux的要求并没有什么区别。
- 数据改变只能通过纯函数完成(Changes are made with purefunctions)。纯函数就是Reducer。在Redux中,每个reducer的函数签名为:reducer(state,action)。Redux的reducer只负责计算状态,却并不负责存储状态。
2.容器组件和傻瓜组件
在Redux框架下,一个React组件基本上就是要完成以下两个功能:
- 和Redux Store打交道,读取Store的状态,用于初始化组件的状态,同时还要监听Store的状态改变;当Store状态发生变化时,需要更新组件状态,从而驱动组件重新渲染;当需要更新Store状态时,就要派发action对象;
- 根据当前props和state,渲染出用户界面。
容器组件和傻瓜组件分别实现上面的功能。
两个组件是父子组件的关系。承担第一个任务的组件,也就是负责和Redux Store打交道的组件,处于外层,所以被称为容器组件(Container Component);对于承担第二个任务的组件,也就是只专心负责渲染界面的组件,处于内层,叫做展示组件(PresentationalComponent)。
容器组件和傻瓜组件分工
傻瓜组件是一个纯函数,且是无状态的,这种组件叫做“无状态”组件。
3.组件context
一个应用中,最好只有一个地方需要直接导入Store,这个位置当然应该是在调用最顶层React组件的位置。
所谓Context,就是“上下文环境”,让一个树状组件上所有组件都能访问一个共同的对象,为了完成这个任务,需要上级组件和下级组件配合。
我们来创建一个特殊的React组件,它将是一个通用的context提供者,可以应用在任何一个应用中,我们把这个组件叫做Provider。
单纯来看React的这个Context功能的话,必须强调这个功能要谨慎使用,只有对那些每个组件都可能使用,但是中间组件又可能不使用的对象才有必要使用Context,千万不要滥用。
4.react-redux
react-redux要求store不光是一个object,而且是必须包含三个函数的object,这三个函数分别是。subscribe、dispatch、getState。
react-redux在componentWillReceiveProps函数中会检查这一次渲染时代表store的prop和上一次的是否一样。如果不一样,就会给出警告,这样做是为了避免多次渲染用了不同的Redux Store。