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
