Redux 是 JavaScript 状态容器,提供可预测化的状态管理。前端
它认为:Web应用是一个状态机,视图与状态一一对应。从架构层面来讲,一般但愿UI跟数据、逻辑分离,直观体现就是:UI = render(state)服务器
如今的Web应用涉及大量数据交互、异步操做等,无疑都在增长前端的复杂性,须要维护的state也愈来愈多。而Redux就是试图让每一个state变化都是可预测,将应用中全部的action与state统一管理。markdown
在讲Redux的工做流程以前,需了解几个Redux相关的核心概念:架构
具体工做流程: 用户经过View(或服务器响应)触发Action,Dispatch方法将Action Creator函数生成的Action派发到Store,Store自动调用Reducer,并向它传入当前State和Action,Reducer返回新的State,State一旦有变化,Store就会经过监听函数来更新View。 借用一张图来描述这一过程: app
严格的单向数据流是 Redux 架构的设计核心。异步
以从服务器响应文章内容为例 Action函数
const LOAD_ARTICLES_DETAIL = 'LOAD_ARTICLES_DETAIL' const LOAD_ARTICLES_DETAIL_SUCCESS = 'LOAD_ARTICLES_DETAIL_SUCCESS' const LOAD_ARTICLES_DETAIL_ERROR = 'LOAD_ARTICLES_DETAIL_ERROR' 复制代码
Action Creatorspa
export const loadArticlesDetail = () => ({ type: LOAD_ARTICLES_DETAIL }) export const loadArticlesDetailSuccess = result => ({ type: LOAD_ARTICLES_DETAIL_SUCCESS, result }) export const loadArticlesDetailFailure = error => ({ type: LOAD_ARTICLES_DETAIL_ERROR, error }) 复制代码
Store设计
const store = createStore(reducers) 复制代码
Reducer (previousState, action) => (newState)code
export default (state = initalState, action) => { switch (action.type) { case LOAD_ARTICLES_DETAIL: { return { ...state, loading: true, error: false } } case LOAD_ARTICLES_DETAIL_SUCCESS: { return { ...state, loading: false, error: false, articlesDetail: action.result } } case LOAD_ARTICLES_DETAIL_ERROR: { return { ...state, loading: false, error: true } } default: return state } } 复制代码
Redux主要源码总体结构:
export { createStore, combineReducers, bindActionCreators, applyMiddleware, compose } 复制代码
这是入口文件导出的方法,也是Redux支持的方法,这些方法的实如今主工做流程文件和辅助函数文件,接下来看主工做流程。
export default function applyMiddleware(...middlewares) { return (createStore) => (reducer, preloadedState, enhancer) => { const store = createStore(reducer, preloadedState, enhancer) let dispatch = store.dispatch let chain = [] const middlewareAPI = { getState: store.getState, dispatch: (...args) => dispatch(...args) } chain = middlewares.map(middleware => middleware(middlewareAPI)) dispatch = compose(...chain)(store.dispatch) return { ...store, dispatch } } } 复制代码
从源码上看,最后是返回了一个Store和一个被更新过的dispatch方法,实现了对Store的加强。
export default function bindActionCreators(actionCreators, dispatch) { if (typeof actionCreators === 'function') { return bindActionCreator(actionCreators, dispatch) } } 复制代码
使用dispatch把action creator都包装起来,这样能够直接调用它们。
export default function compose(...funcs) { if (funcs.length === 0) { return arg => arg } if (funcs.length === 1) { return funcs[0] } return funcs.reduce((a, b) => (...args) => a(b(...args))) } 复制代码compose这个方法,传入的一系列函数,执行的最终结果是把各个函数串联起来。