2017-06-02 120 views
2

会在传入动作中添加回调action.data会出现任何错误/反模式(按照'思考反应/还原')吗?向Redux Reducer添加回调

// reducer 
ACTION_FOR_REDUCER() { 
    var x = 123 
    if (action.data.callback) action.data.callback(x) 
    return { 
    something: action.data.somedata 
    } 
}, 

再后来访问该数据在App时动作被调用(在一个容器也许)

// later in the app 
this.props.dispatch(changeSomething({ 
    somedata: somedata, 
    callback: (x) => { console.log(x) } 
}))  

回答

3

这个想法没有错,执行是。

而不是添加回调,从行动中返回一个承诺(您需要redux-thunk中间件或一些类似的选择)。

然后,你可以简单地做:

dispatch(myAction).then(callback); 

当然,你也可以简单地派遣在回调另一个动作,通常最终成为一个复合动作。

const myAction = ... 
const callbackAction = ... 

const compoundAction =() => dispatch => { 
    dispatch(myAction()) 
     .then(() => dispatch(callbackAction())); 
}; 
5

终极版的第三原理(在introduction section of the docs列出)​​是“的变化是与纯函数制成。

纯函数是,它总是返回相同的结果给定相同的输入,并且不会引起任何副作用的功能。有一个回调日志最明显的东西将是一个副作用!

The docs go on to say:

这是非常重要的是,减速保持纯净。在减速机内你永远不应该做的事情:

  • 改变它的参数;
  • 执行API调用和路由转换等副作用;
  • 调用非纯函数,例如Date.now()或Math.random()。

这背后的原因是它使你的减速预见的 - 你知道,由于具有一定的有效载荷的动作,你保证有相同的输出。这使得你的应用程序都更容易理解作为一个开发者,并更容易进行单元测试。

如果要执行的副作用时的动作发生,你应该安装一个中间件,它允许你这样做 - 它们的一些常见的例子有:

  • redux-thunk,它允许你调度功能反过来又能调度操作(通常用于制造API调用)
  • redux-logger,它允许你注销分派的行动。
  • redux-devtools-extension,它允许您查看在Chrome扩展devtools你的状态和行为。

如果你不能找到一个中间件组件,做你所需要的(罕见的,说实话 - !有很多在那里的话),你可以write your own很容易。

+0

如果你想调用一些外部的API,我会建议创建自己的'middleware' – Ematipico

+0

@Ematipico:将在中间件增加一些细节来回答:) –

+0

谢谢,我觉得终极版-thunk是什么,我正在寻找。关于变异这个问题,是不是后来作为'dispatch'的一部分发生的突变,而不是在reducer本身中呢? –

0

回调引入了副作用,所以当使用Redux时,您应该考虑返回一个新状态,例如done: true标志,并对componentDidUpdate作出反应。

对于管理异步和效果,您可以使用redux-saga,redux-thunk,RxJs或其他库。 如果你想坚持回调,为什么还要用终极版费心呢?