React-Redux 中间件解密

最近在看react+redux实现的第四章,被一个奇葩的中间件搞的云里雾里,都被折腾坏了,通过一些列的测试最终解密柯里化函数的迷雾。

import React from "react";
import { render } from "react-dom";
import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from 'redux-devtools-extension';
import { Provider } from "react-redux";
import { createLogger } from "redux-logger";
import thunk from "redux-thunk";
import reducer from "./reducers";
//import { getAllProducts } from "./actions";
import App from "./containers/App.jsx";
import "./index.css";

const middleware = [thunk];
if (process.env.NODE_ENV !== "production") {
  middleware.push(createLogger());
}

const store = createStore(reducer, composeWithDevTools(
  applyMiddleware(...middleware),
));

/**
 * Action 创建函数
 * 获取商品(书籍)
 */
const getProductsAction = products => ({
  type: types.RECEIVE_PRODUCTS,
  products
})

/**
 * Action 创建函数
 * 创建一个被绑定的 action 创建函数来自动 dispatch
 */
export const getAllProducts = () => dispatch => {
  shop.getProducts(products => {
    dispatch(getProductsAction(products))
  })
}

// store.dispatch(getAllProducts());
// 上述调用方式实际为下述形式,基于getAllProducts() 构造一个dispatch(action)调用格式
// 柯里化函数,dispatch获取为sotre.dispatch
store.dispatch((dispatch) => {
  dispatch({
    type: 'RECEIVE_PRODUCTS',
    products: [
      { "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 41.00, "inventory": 2 }
    ]
  });
})
//演变测试1-1 测试发现这样是不行的,后来才发现这里仅仅是定义了构造 dispatch(action)没有执行
store.dispatch(()=>dispatch =>{
  dispatch({
      type: 'RECEIVE_PRODUCTS',
      products: [
      { "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 42.00, "inventory": 2 }
    ]
    });
});

//演变测试1-2 这样是可以的,利用apply()执行 ()=>函数生成 dispatch(action)结构
store.dispatch((()=>dispatch =>{
  dispatch({
      type: 'RECEIVE_PRODUCTS',
      products: [
      { "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 42.00, "inventory": 2 }
    ]
    });
}).apply());

//演变测试2
const action1 = ()=> (dispatch) => {
  dispatch(
    {
      type: 'RECEIVE_PRODUCTS',
      products: [{ "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 43.00, "inventory": 2 }
      ]
    }
  );
}
store.dispatch(action1); //这样是不行的,因为值是一个函数签名需要执行生成需要的dispatch
store.dispatch(action1()); //这样是行的,这个种要解释很长,但慢慢体会吧。
//演变测试3
store.dispatch(() => {
  let dispatch = store.dispatch;
  dispatch(
    {
      type: 'RECEIVE_PRODUCTS',
      products: [{ "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 44.00, "inventory": 2 }
      ]
    }
  );
});

//演变测试3-1
const action2 = () => {
  let dispatch = store.dispatch;
  dispatch(
    {
      type: 'RECEIVE_PRODUCTS',
      products: [{ "id": 1, "title": "《JavaScript 权威指南》", "price": 136.20, "inventory": 3 },
      { "id": 2, "title": "《Python核心编程》", "price": 44.50, "inventory": 8 },
      { "id": 3, "title": "《C程序设计》", "price": 45.00, "inventory": 2 }
      ]
    }
  );
}
store.dispatch(action2);

//通过演变3 演变3-1 应该明白了函数柯里化,就是在函数中声明函数并且执行函数
//所以回到 getAllProducts() 以及 第一个演变函数 我们发现其实store.dispatch(action)
//这个是dispatch(action)声明,我们主要声明action函数体,至于dispatch的来源实际上
//是柯里化函数内部赋值和实现的。如演变3 3-1 函数   let dispatch = store.dispatch;
//主要是下述这段代码相当于重写了sotre dispatch函数,类似实现了aop
//内部会接收一个柯里化函数代码段。至于代码段需要的函数签名与变量在aop内部实现
// const middleware = [thunk];
// if (process.env.NODE_ENV !== "production") {
//   middleware.push(createLogger());
// }
// const store = createStore(reducer, composeWithDevTools(
//   applyMiddleware(...middleware),
// ));
//


render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);

  

猜你喜欢

转载自www.cnblogs.com/ms_senda/p/12738739.html