State的结构

数据库主要信息数据 + ui数据 + 应用状态数据

拆分Reducer

combineReducers 会调用所有它包装的reducer,你可以在任何reducer中调用combineReducer
一个大的reducer可以拆成响应相同action维护不同state的多个子reducer


重构Reducer

提取工具函数 =》 提取case的函数 =》 按照reducer维护的state划分reducer =》 createReducer创建reducer(减少样板代码)

State的范式化

数据尽量只在一个地方定义,更易于更新,取用通过索引
每个项目都将ID作为Key, 自身作为Value
将不同类型数据关系表存放到共同的父级下

Reducer逻辑复用

使用高阶Reducer,也就是接收一个Reducer, 根据条件返回新的reducer, 可当作reducer创建函数

不可变更模式

尽量写reducer扁平化,避免多层嵌套的去更新

初始化State

createStore的时候第二个可选参数 preloadedState。一般建议写reducer的时候ES6参数默认值的写法,且构建store的时候默认发送一次undefined到所有的reducer, preloadedState 将是默认值失效

API文档

createStore(reducer, [preloadedState], enhancer)

reducer(state, action)
preloadedState: state树的默认值,需要保持和reducers的key一致
enhancer : store增强器,是一个createStore的高级函数(applyMiddleware就是一种)

Store

subscribe(listener)

添加监听器,每次dispatch都会执行一次, 回调函数可以使用getState拿到当前的state
每次dispatch会保存一次快照,注意避免使用dispatch陷入死循环
执行返回函数解绑

replaceReducer(nextReducer)

替换计算当前state的reducer =》 redux热加载

bindActionCreators(actionCreators, dispatch)

actionCreators = { actionA, actionB ….}
传递给子组件,子组件就直接使用actionAFunction{}代替dispatch(action), 不用管redux