zoukankan      html  css  js  c++  java
  • 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")
    );
    

      

  • 相关阅读:
    从头学习Drupal基本概念和架构
    《Zend Framework in Action》 《ZF实战》 中文翻译
    網頁技術與標準
    Symbian定义属于自己MenuBar(转)
    Symbian中使用日志类(RFileLogger)(转)
    如何向Symbian C++程序中添加多语言支持(转)
    (转)symbian 接入点选择 & ini文件读写
    How to get TDataType (Mime type) of a file(转)
    Function ereg() is deprecated——drupal6.13 & PHP5.3
    ecom.h: No such file or directory
  • 原文地址:https://www.cnblogs.com/ms_senda/p/12738739.html
Copyright © 2011-2022 走看看