Redux-thunk允许您创建返回函数而不是操作的操作创建器。内部函数接收存储方法dispatch和getState作为参数。
function incrementAsync() {
return (dispatch, getState) => {
setTimeout(() => {
dispatch(increment());
}, 1000);
};
}但与此同时,react-redux的connect已经有了一个mapDispatchToProps参数,可用于将操作创建器包装到调度调用中,以便可以直接调用它们。使用mapDispatchToProps,您已经可以这样做,
const mapDispatchToProps = (dispatch) => ({
incrementAsync: () => {
setTimeout(() => {
dispatch(increment());
}, 1000);
}
});
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent)在我看来,没有redux-thunk也可以做到这一点。为什么我们首先要有redux-thunk库呢?我确信我只是看不到它,因为redux-thunk是一个相当流行的库。
发布于 2017-06-12 16:32:23
简而言之,您的解决方案完全正确。
我认为使用thunk中间件的便利之处在于,你可以用同样的方式处理任何动作创建器异步或异步调用,这意味着你不必传递分派函数。只要你分派的是一个函数,分派就会被注入到它的返回函数中。总而言之,使用redux-thunk使得动作创建者是可组合的。
请看丹·阿布拉莫夫的详细答案:How to dispatch a Redux action with a timeout?
同样,只要看看redux-thunk code就能帮助我理解这一点。
发布于 2018-08-25 05:14:01
确实,您可以通过这种方式从操作访问dispatch,但是redux-thunk使之成为可能,而不需要包装器函数和显式分派移交。
您还可以通过作为第二个参数提供的getState()函数从您的操作中立即访问状态。
// actionFile.js
export someAction(dispatch) {
return function(value) {
dispatch({ type: 'SOME_TYPE', value });
}
}
// component.jsx
const mapDispatchToProps = (dispatch) => ({
someAction: someAction(dispatch)
});与
// actionFile.js
export someAction(value) {
return function(dispatch, getState) {
dispatch({ type: 'SOME_TYPE', value });
// maybe do some stuff with getState()
}
}
// component.jsx
const mapDispatchToProps = { someAction };它绝对是可选的,但在我看来要干净得多,最重要的是在组件和动作创建者之间提供了更好的关注点分离。也就是说,当你需要异步调度或触发副作用时,你不需要为如何定义你的mapDispatchToProps而烦恼。
发布于 2018-11-12 19:26:38
除了Redux Thunk之外,第一个例子还有两个很大的优势:
https://stackoverflow.com/questions/44493294
复制相似问题