【问题标题】:Redux middleware with callback带回调的 Redux 中间件
【发布时间】:2016-07-15 16:12:37
【问题描述】:

我真的很喜欢这样写动作的概念:

function signUp(data, callback) { 
return {
    [CALL_API]: {
      type: 'SOME_TYPE',
      url: `/api/account/signup`, 
      method: 'POST',
      data: data

    }
  }
}

但是对于像signUp 这样的东西,我不想修改/触摸 store 以从服务器获取回调


在我的 React 组件中,我有一个动作,它通过动作调用 api 并更改状态。

  this.signUp($(form).serialize(), function(data) {  this.setState({response: data});   }.bind(this))

动作signUp看起来像这样

function signUp(data, callback) { 
 postRequest(
    '/api/account/signup', 
    data, 
    'POST', 
    callback)
}


function postRequest(url, data, method, callback) { 
callback(true); //// just testing  
}

如你所见,与第一个相比,语法和代码长度并不漂亮


问题:有没有办法修改 redux 中间件或者有一个替代的 JSON 函数(类似于CALL_API)来接受组件的回调而不接触商店?我真的很想使用CALL_API 语法:)

【问题讨论】:

    标签: javascript node.js redux middleware


    【解决方案1】:

    您可以编写中间件来拦截动作并在不修改存储状态的情况下做一些工作。

    // Action creator    
    function signUp(data, callback) { 
      return {
          type: CALL_API
          url: '/api/account/signup', 
          method: 'POST',
          data: data,
          callback: callback
      }
    }
    
    // Middleware
    const actionInterceptor = store => next => action => {
        if (action.type === CALL_API) {
            postRequest(action.url, action.method, action.data, action.callback);
        }
        else {
            return next(action);
        }
    }
    
    ...
    
    const store = createStore(reducer, initialState, applyMiddleware(actionInterceptor));
    

    【讨论】:

    • 谢谢,但我收到“回调未定义”.. 你测试过这段代码吗?
    • 我进行了编辑以将回调添加到操作以及它在拦截器中的使用方式。
    【解决方案2】:

    我真的很喜欢这样写动作的概念:

    ...

    但对于像注册这样的事情,我不想修改/触摸商店以从服务器获取回调

    好的,但是为此使用 redux 有什么意义呢?

    我的理解:
    你想打电话给dispatch(signUp(data, callback))(简体)

    您的注册 actionCreator 应如下所示:

    function signUp(data, callback) {
      return function(dispatch) {
        //.. do your stuff with data..
        //.. and call your callback or pass it to another function
      }
    }
    

    对不起,如果误解了您的问题,如果仍有不清楚的地方,请写评论。

    【讨论】:

    • 谢谢,CALL_API 是我希望对来自组件的简单 GET/POST 请求执行的操作类型。所以“调度”没有帮助,因为它用于通知最终改变状态/存储的减速器
    • @Fox 好的,你的帖子和 redux 有什么关系?
    • @Fox by design Redux 中的 ACTIONS 与状态有关。你想要一些其他效果。这不是问题,你可以做到,但它不是 redux 。
    • ACTIONS 源自 redux... 我忙得没法争辩。还是谢谢
    猜你喜欢
    • 2019-12-29
    • 2016-10-01
    • 2022-07-16
    • 2019-12-04
    • 2021-11-14
    • 2018-03-19
    • 2018-11-06
    • 2017-07-28
    • 2018-06-12
    相关资源
    最近更新 更多