美文网首页javascript
redux-thunk入门

redux-thunk入门

作者: 龚达耶 | 来源:发表于2019-02-17 23:39 被阅读61次

    今天来介绍在使用redux中必不可少用要用到的中间件redux-thunk。如果还没有看过我之前关于redux介绍的可以参照

    传送门

    里面的sample4就是关于redux-thunk的。

    redux-thunk就是redux的中间件,中间件就是你可以在收到请求和返回请求之间做一些操作。
    而thunk中文意思是形实转换程序, 这样可能不太好理解我们来看例子。

    // calculation of 1 + 2 is immediate
    // x === 3
    let x = 1 + 2;
    
    // calculation of 1 + 2 is delayed
    // foo can be called later to perform the calculation
    // foo is a thunk!
    let foo = () => 1 + 2;
    

    这是官方给出来的例子,我们可以大致理解为当一个操作被delay的时候我们可以称之为thunk。

    A thunk is a function that returns a function.
    This is a thunk.

    而redux-thunk恰恰正好就是来做这个事的。

    因为action函数只能返回action对象, 而redux-thunk可以通过返回的函数延迟dispatch或者在指定条件下才dispatch。这个函数接受store的两个方法dispatch和getState。

    例如调取api。

    首先我们要

    npm install redux-thunk
    

    sample4的版本为4.0.1

    第一步我们要在index.js中让middleware可用。

    我们将使用到compose和applyMiddleware
    compose 其作用是把一系列的函数,组装生成一个新的函数,并且从后到前,后面参数的执行结果作为其前一个的参数。compose(f, g, h) is identical to doing
    (...args) => f(g(h(...args))).

    applyMiddleware 最常见的使用场景是无需引用大量代码或依赖类似 Rx 的第三方库实现异步 actions。这种方式可以让你像 dispatch 一般的 actions 那样 dispatch 异步 actions。

    import { applyMiddleware, compose, createStore, combineReducers } from 'redux'; // 引入combineReducers, applyMiddleware
    

    然后先使用compose连接到一起在放在store里面

    const allStoreEnhancers = compose(
      applyMiddleware(thunk),
      window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
    ) // 其作用是把一系列的函数,组装生成一个新的函数,并且从后到前,后面参数的执行结果作为其前一个的参数。
    
    const store = createStore(
      allReducers,
      {reducer1:[1], reducer2:[2], reducer3:[3]}, // 替换为allReducers 并且设置初始state 作为第二个参数
      allStoreEnhancers
    );  
    

    如果像官方文档一样不使用compose也可以

    import { createStore, applyMiddleware } from 'redux';
    import thunk from 'redux-thunk';
    import rootReducer from './reducers/index';
    
    // Note: this API requires redux@>=3.1.0
    const store = createStore(
      rootReducer,
      applyMiddleware(thunk)
    );
    

    接下来在action里我们就可以异步返回一个函数

    这里用到axios

    // 添加一个方法返回一个函数
    export function getRequest() {
      return dispatch => {
        axios({
          method: 'get',
          url: 'https://randomuser.me/api',
        })
        .then((res)=>{
          const action = {
            type: UPDATE_REQUESTNAME,
            payload:{
              reducer3: res.data.results[0].email
            }
          }
          //dispatch(action)
          return action
        })
        .catch((err)=>{
          console.log(err)
        })
      }
    }
    

    在redux-thunk 2.1.0之后的版本中我们可以注入自定义参数

    需要用的withExtraArgument方法

    就是在thunk后面调用

    const store = createStore(
      reducer,
      applyMiddleware(thunk.withExtraArgument(api))
    )
    
    // later
    function fetchUser(id) {
      return (dispatch, getState, api) => {
        // you can use api here
      }
    }
    

    多个参数的话就要使用解构

    const store = createStore(
      reducer,
      applyMiddleware(thunk.withExtraArgument({ api, whatever }))
    )
    
    // later
    function fetchUser(id) {
      return (dispatch, getState, { api, whatever }) => {
        // you can use api and something else here
      }
    }
    

    相关文章

      网友评论

        本文标题:redux-thunk入门

        本文链接:https://www.haomeiwen.com/subject/gbqoeqtx.html