首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >既然我们已经有了mapDispatchToProps,为什么还要redux-thunk呢?

既然我们已经有了mapDispatchToProps,为什么还要redux-thunk呢?
EN

Stack Overflow用户
提问于 2017-06-12 15:08:32
回答 5查看 1.1K关注 0票数 4

Redux-thunk允许您创建返回函数而不是操作的操作创建器。内部函数接收存储方法dispatch和getState作为参数。

代码语言:javascript
复制
function incrementAsync() {
  return (dispatch, getState) => {
    setTimeout(() => {
       dispatch(increment());
    }, 1000);
  };
}

但与此同时,react-redux的connect已经有了一个mapDispatchToProps参数,可用于将操作创建器包装到调度调用中,以便可以直接调用它们。使用mapDispatchToProps,您已经可以这样做,

代码语言:javascript
复制
const mapDispatchToProps = (dispatch) => ({
  incrementAsync: () => {
    setTimeout(() => {
      dispatch(increment());
    }, 1000);
  }
});
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent)

在我看来,没有redux-thunk也可以做到这一点。为什么我们首先要有redux-thunk库呢?我确信我只是看不到它,因为redux-thunk是一个相当流行的库。

EN

回答 5

Stack Overflow用户

发布于 2017-06-12 16:32:23

简而言之,您的解决方案完全正确。

我认为使用thunk中间件的便利之处在于,你可以用同样的方式处理任何动作创建器异步或异步调用,这意味着你不必传递分派函数。只要你分派的是一个函数,分派就会被注入到它的返回函数中。总而言之,使用redux-thunk使得动作创建者是可组合的。

请看丹·阿布拉莫夫的详细答案:How to dispatch a Redux action with a timeout?

同样,只要看看redux-thunk code就能帮助我理解这一点。

票数 0
EN

Stack Overflow用户

发布于 2018-08-25 05:14:01

确实,您可以通过这种方式从操作访问dispatch,但是redux-thunk使之成为可能,而不需要包装器函数和显式分派移交。

您还可以通过作为第二个参数提供的getState()函数从您的操作中立即访问状态。

代码语言:javascript
复制
// actionFile.js
export someAction(dispatch) {
  return function(value) {
    dispatch({ type: 'SOME_TYPE', value });
  }
}

// component.jsx
const mapDispatchToProps = (dispatch) => ({
  someAction: someAction(dispatch)
});

代码语言:javascript
复制
// 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而烦恼。

票数 0
EN

Stack Overflow用户

发布于 2018-11-12 19:26:38

除了Redux Thunk之外,第一个例子还有两个很大的优势:

  1. 它更容易测试,因为它是隔离的和功能性的,所以你只需要包含它并使用它,以便断言它的行为是正确的(没有适当的查询,模拟或浅渲染问题,如果它在一个component)
  2. It's中可以重用它(第二个例子是不可能重用的)。想象一下,您必须从应用程序中的多个位置分派相同的操作,并使用第二种模式,复制代码,然后操作的要求发生变化?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44493294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档