首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用redux-thunk‘`bindActionCreators`’

如何使用redux-thunk‘`bindActionCreators`’
EN

Stack Overflow用户
提问于 2017-11-18 02:06:02
回答 3查看 4.5K关注 0票数 6

我对JavaScript和react非常陌生,我已经有了需要添加功能的现有项目。它使用reduxredux-thunkredux-saga一起发送API请求。目前,它只支持每个组件一个dispatch函数,我需要对saga的几种类型的请求进行dispatch。我试图通过bindActionCreatorsdispatch添加到商店中,但没有效果。我完全迷上了mapDispatchToProps的部分,然后我该如何“发动行动”呢?

在对道具的一次派遣中,我做到了以下几点:

代码语言:javascript
复制
let sdtp = (arg) => {
   return (dispatch) => {
     dispatch({
       type: 'GET_TEST_HASHMAP_SAGA',
       hashmap: arg
     })
   }
 }

export default MainPage = connect(
   mapStateToProps,
   { sdtp }
)(MainPage);

我可以“访问函数”(这是正确的术语吗?)至少我的传奇会在MainPage.render()组件中被调用):

代码语言:javascript
复制
`this.props.sdtp({'hello':'world'});`

但是当我改变使用bindActionCreators时,我不能再在道具中访问它了(我尝试了很多不同的实验,我几乎放弃了)。

下面是我如何构造多个调度:

代码语言:javascript
复制
let action1 = (args) => {
   return (dispatch) => {
      dispatch({
         type: 'GET_TEST_HASHMAP_SAGA',
         hashmap: arg
      });
   }
}

let action2 = (args) => {
   return (dispatch) => {
      dispatch({
         type: 'GET_TEST_HASHMAP_SAGA2',
         params: arg
      });
   }
}

let action3 = (args) => {
   return (dispatch) => {
      dispatch({
         type: 'GET_TEST_HASHMAP_SAGA3',
         args: arg
      });
   }
}

let mdtp = (dispatch) => {
  return {
    actions: bindActionCreators(action1, action2, action3, dispatch)
  }
}

export default MainPage = connect(
   mapStateToProps,
       { mdtp }
)(MainPage);

我试图像这样访问actions

this.props.mdtp.action1({arg: 'hello'});

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-18 04:59:46

connect需要四个arguments...most,通常只需要前两个。

mapStateToProps,你有,我假设它是一个函数。

mapDispatchToProps是second...the的问题就在那里。

is nothing but a for loop...leave说出来,你就会更好地理解正在发生的事情。

试试这个:

代码语言:javascript
复制
function mapDispatchToProps(dispatch) {
  return {
     action1: (args) => dispatch(action1(args)),
     action2: (args) => dispatch(action2(args)),
  }
}

 export default MainPageContainer = connect(
   mapStateToProps,
   mapDispatchToProps
 )(MainPage)

并称其为this.props.action1(args)this.props.action2(args)

如果您坚持使用被高估的bindActionCreators,语法将是:

代码语言:javascript
复制
 function mapDispatchToProps(dispatch){
   return {
     actions: bindActionCreators({
       action1,     
       action2,
     }, dispatch)
   }
 }

另外,使用const而不是let,因为您没有重新定义该值。还最好以与组件的类名不同的名称导出连接的组件。

票数 9
EN

Stack Overflow用户

发布于 2017-11-18 05:03:34

在mpdt函数中,需要返回bindActionCreators调用的结果,而不是带有操作键的对象。

所以,应该是

代码语言:javascript
复制
const mdtp = (dispatch) => {
  return bindActionCreators({
    action1, action2, action3
  }, dispatch);
};

你可以叫他们this.props.action1(...)

从您的代码中也可以看出,您混淆了将操作创建者传递给组件的两种方法。有一种方法在上面描述过。另外,您可以使用对象符号将操作创建器直接传递给connect(),如下所示

代码语言:javascript
复制
export default MainPage = connect(
   mapStateToProps,
   { action1, action2, action3 }
)(MainPage);

会有同样的结果。您的第一种方法,使用sdtp动作创建者使用这种方法。

票数 2
EN

Stack Overflow用户

发布于 2017-11-18 10:24:54

或者,您也可以完全跳过mapDispatchToProps

在您的render()函数中,您可以直接调用dispatch,如下所示:

this.props.dispatch({type: 'GET_TEST_HASHMAP_SAGA2', params: {"hello": "world"}});

然后,在您的connect函数中,可以完全跳过mapDispatchToProps参数。

代码语言:javascript
复制
export default MainPage = connect(
   mapStateToProps
)(MainPage);

我知道这不是答案,但这也是一个可行的选择

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47361754

复制
相关文章

相似问题

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