Redux

Redux是对状态的集中管理。所谓状态是指影响到UI变化的数据。如:切换主题背景色、鼠标悬停view边框加粗等。

一、Redux是什么

Redux是一个全局的、唯一的、不可改变的内存状态[数据库]。这里面的不可以改变指的是不会改变原有状态,只会产生新状态。

Redux主要分为三个角色:

  • Store

Store是获得状态的源头,也是用于将Action发射出去。

  • Action

Action可以理解为信号或者一个事件。Action包含type、payload

  • Reducer

Reducer是一个纯函数(处理跟界面相关的数据)、可以接收到 任何 Action,Reducer并不改变状态,只会产生新状态。
Reducer的函数形如下面示例:

1
2
3
  reducer(state = initialState, action: {type: string, payload: any}) : State {
      ...
  }

当返回新状态时, 可以利用下面两种写法:
* ES6写法

1
state = {...state, passwordRule: action.payload};
  • 非ES6写法

    Object.assign({}, state, {passwordRule: action.payload});

推荐安装插件: Redux DevTools

二、Redux数据流

  • component产生action(信号/事件)

  • actionc触发effect,业务处理数据

  • store中存储state、reducer

  • reducer产生新的state

  • state修改,更新component

针对图例中Effect、selector有下面的理解:

  • Effect

如果Action看成一个流的话,和UI相关的一个处理当成Reducer,那么UI状态之外的更改我们把它叫做Effect。
Effect本身也是一个流,是一个action的流。如:this.actions$.ofType() 可以进行action的筛选。一般和api交互的action(如:get、post、put等)在effect中执行。直接跟UI交互的action在reducer中执行。如:当从api端抓取数据返回的时候,成功的场合发送LOAD_SUCCESS。失败的场合发送LOAD_FAIL。在reducer中处理成功和失败的action,产生新的State,更新相关UI。

  • Selector

当在reducer中产生新的State后,可以从Store中获取到新的state对应payload数据。如:this.store.select(XXAction.playload.value), 也可以利用管道的方式取得相关数据。如:this.store.pipe(selection(XXXSelectors.getValus))。

reselect写法形如:

1
2
3
4
  const getValues = createSelector(
      getPasswordruleState,
      (state: PasswordruleState) => state.passwordRule.values
  );

reselect是带有 记忆 功能的函数运算,无论携带多少参数,最后一个才是用于函数计算,前面参数都作为它的输入。之所以说reselect带有记忆功能,是因为如果后一次的请求参数和前面一次请求相同,则从缓存中直接将数据返回。