Redux 是一个 数据管理中心,可以把它理解为一个全局的 data store 实例。它通过一定的使用规则和限制,保证着数据的健壮性、可追溯和可预测性。它与 React 无关,可以独立运行于任何 JavaScript 环境中,从而也为同构应用提供了更好的数据同步通道。
单一数据源: 整个应用只有唯一的状态树,也就是所有 state 最终维护在一个根级 Store 中;
状态只读: 为了保证状态的可控性,最好的方式就是监控状态的变化。那这里就两个必要条件:
纯函数: 规定只能通过一个纯函数 (Reducer) 来描述修改;
大致的数据结构如下所示:
getState
: 获取 state;dispatch
: 触发 action, 更新 state;subscribe
: 订阅数据变更,注册监听器;// 创建const store = createStore(Reducer, initStore);
// 一个普通的 Actionconst action = {type: 'ADD_LIST',item: 'list-item-1',}// 使用:store.dispatch(action)// 通常为了便于调用,会有一个 Action 创建函数 (action creater)funtion addList(item) {return const action = {type: 'ADD_LIST',item,}}// 调用就会变成:dispatch(addList('list-item-1'))
// 一个常规的 Reducer// @param {state}: 旧数据// @param {action}: Action 对象// @returns {any}: 新数据const initList = [];function ListReducer(state = initList, action) {switch (action.type) {case "ADD_LIST":return state.concat([action.item]);break;defalut: return state;}}
- 遵守数据不可变,不要去直接修改 state,而是返回出一个 新对象,可以使用
assign / copy / extend / 解构
等方式创建新对象;- 默认情况下需要 返回原数据,避免数据被清空;
- 最好设置 初始值,便于应用的初始化及数据稳定;
<Provider>
: 将 store 通过 context 传入组件中;connect
: 一个高阶组件,可以方便在 React 组件中使用 Redux;store
通过mapStateToProps
进行筛选后使用props
注入组件mapDispatchToProps
创建方法,当组件调用时使用dispatch
触发对应的action
combineReducers()
进行重构合并;dispatch(Action)
即可,下面是三种不同的异步实现: