redux是什么?
A Predictable State Container for JS Apps
JS应用程序的可预测状态容器
redux使用
createStore和combineReducers
使用Redux.createStore(reducers, initState, enhancer)生成一个store对象
1、第一个入参是一个reducers函数,我们可以通过使用Redux.combineReducers将多个reducers合并成一个大的reduer对象
2、第二个入参是初始化的state,如果使用了combineReducers,那么必须传入一个和reducers结构一样的对象类型
3、第3个入参就是 中间件
const rereducer1 = (state = 0, action) => {switch(action.type) {case 'A': return 'a';break;case 'B': return 'b';break;}}const rereducer2 = (state = 0, action) => {switch(action.type) {case 'A1': return 'a1';break;case 'B1': return 'b1';break;}}const reducers = {reducer1,rereducer2,}var store = Redux.createStore(Redux.combineReducers(reducers))/***看看store对象里面有哪些属性*/{dispatch: dispatch,subscribe: subscribe,getState: getState,replaceReducer: replaceReducer}
applyMiddleware
该API做的一件事情,就是把dispatch做了一个加强,替换了redux自己生成的dispatch函数,什么叫做加强版本呢,就是在原来的dispatch函数的基础上,外面加了一层中间价的机制。
没有加中间件之前的执行顺序是 dispatch(action) -> 监听函数
加了中间件之后的执行顺序是 dispatch(action),此时的dispatch函数和上面的dispatch函数不是同一个,现在的dispatch函数是加载的一个中间价函数的句柄。middlewara1 -> middlewara2 -> dispatch(action)【这个dispatch函数和上面的一致】-> 监听函数 -> middlewara2 -> middlewara1
function createStore(reducer, preloadedState, enhancer) {return enhancer(createStore)(reducer, preloadedState); 这里的enhancer就是我们的applyMiddleware函数}export default function applyMiddleware(...middlewares) {return createStore => (...args) => {const store = createStore(...args)let dispatch = () => {throw new Error('Dispatching while constructing your middleware is not allowed. ' +'Other middleware would not be applied to this dispatch.')}const middlewareAPI = {getState: store.getState,dispatch: (...args) => dispatch(...args)}const chain = middlewares.map(middleware => middleware(middlewareAPI))dispatch = compose(...chain)(store.dispatch)return {...store,dispatch}}}

store对象

store.subscibe(listener)
store.subscribe(function() {console.log(store.getState())})
-
store.dispatch(action)
function dispatch(action) {if (!isPlainObject(action)) {throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');}if (typeof action.type === 'undefined') {throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');}if (isDispatching) {throw new Error('Reducers may not dispatch actions.');}try {isDispatching = true;currentState = currentReducer(currentState, action);} finally {isDispatching = false;}var listeners = currentListeners = nextListeners;for (var i = 0; i < listeners.length; i++) {var listener = listeners[i];listener();}return action;}
action必须是一个纯对象,否则会报错
- 第16行会去执行currentReducer【createStore的时候传的reducers函数】函数来生成一个新的state,故redux中改变state的是通过reducer来改变的
- listeners 就是我们通过store.subscibe(listener) 来订阅的监听函数,每次dispatch之后都会去调用一次
