image.png

redux是什么?

A Predictable State Container for JS Apps
JS应用程序的可预测状态容器

redux使用

redux包含API如下:
image.png

createStore和combineReducers

使用Redux.createStore(reducers, initState, enhancer)生成一个store对象
1、第一个入参是一个reducers函数,我们可以通过使用Redux.combineReducers将多个reducers合并成一个大的reduer对象
2、第二个入参是初始化的state,如果使用了combineReducers,那么必须传入一个和reducers结构一样的对象类型
3、第3个入参就是 中间件

  1. const rereducer1 = (state = 0, action) => {
  2. switch(action.type) {
  3. case 'A': return 'a';break;
  4. case 'B': return 'b';break;
  5. }
  6. }
  7. const rereducer2 = (state = 0, action) => {
  8. switch(action.type) {
  9. case 'A1': return 'a1';break;
  10. case 'B1': return 'b1';break;
  11. }
  12. }
  13. const reducers = {
  14. reducer1,
  15. rereducer2,
  16. }
  17. var store = Redux.createStore(Redux.combineReducers(reducers))
  18. /**
  19. *看看store对象里面有哪些属性
  20. */
  21. {
  22. dispatch: dispatch,
  23. subscribe: subscribe,
  24. getState: getState,
  25. replaceReducer: replaceReducer
  26. }

applyMiddleware

该API做的一件事情,就是把dispatch做了一个加强,替换了redux自己生成的dispatch函数,什么叫做加强版本呢,就是在原来的dispatch函数的基础上,外面加了一层中间价的机制。
没有加中间件之前的执行顺序是 dispatch(action) -> 监听函数
加了中间件之后的执行顺序是 dispatch(action),此时的dispatch函数和上面的dispatch函数不是同一个,现在的dispatch函数是加载的一个中间价函数的句柄。middlewara1 -> middlewara2 -> dispatch(action)【这个dispatch函数和上面的一致】-> 监听函数 -> middlewara2 -> middlewara1

  1. function createStore(reducer, preloadedState, enhancer) {
  2. return enhancer(createStore)(reducer, preloadedState); 这里的enhancer就是我们的applyMiddleware函数
  3. }
  4. export default function applyMiddleware(...middlewares) {
  5. return createStore => (...args) => {
  6. const store = createStore(...args)
  7. let dispatch = () => {
  8. throw new Error(
  9. 'Dispatching while constructing your middleware is not allowed. ' +
  10. 'Other middleware would not be applied to this dispatch.'
  11. )
  12. }
  13. const middlewareAPI = {
  14. getState: store.getState,
  15. dispatch: (...args) => dispatch(...args)
  16. }
  17. const chain = middlewares.map(middleware => middleware(middlewareAPI))
  18. dispatch = compose(...chain)(store.dispatch)
  19. return {
  20. ...store,
  21. dispatch
  22. }
  23. }
  24. }

image.png

store对象

image.png

store.subscibe(listener)

  1. store.subscribe(function() {
  2. console.log(store.getState())
  3. })
  • 添加监听函数,每次dispatch之后都会执行订阅的函数

    store.dispatch(action)

    1. function dispatch(action) {
    2. if (!isPlainObject(action)) {
    3. throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
    4. }
    5. if (typeof action.type === 'undefined') {
    6. throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
    7. }
    8. if (isDispatching) {
    9. throw new Error('Reducers may not dispatch actions.');
    10. }
    11. try {
    12. isDispatching = true;
    13. currentState = currentReducer(currentState, action);
    14. } finally {
    15. isDispatching = false;
    16. }
    17. var listeners = currentListeners = nextListeners;
    18. for (var i = 0; i < listeners.length; i++) {
    19. var listener = listeners[i];
    20. listener();
    21. }
    22. return action;
    23. }
  • action必须是一个纯对象,否则会报错

  • 第16行会去执行currentReducer【createStore的时候传的reducers函数】函数来生成一个新的state,故redux中改变state的是通过reducer来改变的
  • listeners 就是我们通过store.subscibe(listener) 来订阅的监听函数,每次dispatch之后都会去调用一次

社区资料

redux小书
若川笔记