Как "bindActionCreators" с сокращением

Я новичок в JavaScript и реагирую, и у меня есть существующий проект, для которого мне нужно добавить функциональность. Он использует redux и redux-thunk с redux-saga для отправки запросов API. В настоящее время он поддерживает только 1 dispatch функцию для каждого компонента, и мне нужно dispatch несколько типов запросов к саге. Я пытаюсь bindActionCreators добавить dispatch в магазины, но безрезультатно. Я полностью потерял часть mapDispatchToProps и как мне "запустить действие" впоследствии.

в одной отправке в реквизиты, я сделал это:

let sdtp = (arg) => {
   return (dispatch) => {
     dispatch({
       type: 'GET_TEST_HASHMAP_SAGA',
       hashmap: arg
     })
   }
 }

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

и я могу "получить доступ к функции" (это правильный термин, по крайней мере, моя сага вызывается) внутри компонента MainPage.render():

`this.props.sdtp({'hello':'world'});`

но когда я перейду на использование bindActionCreators, я больше не могу получить доступ к нему в реквизитах (я пробовал столько разных экспериментов, которые я почти сдал)

Вот как я создаю несколько рассылок:

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'});

Спасибо заранее!

Ответ 1

connect принимает четыре аргумента... большинству людей обычно нужны только первые два.

mapStateToProps у вас есть, и я предполагаю, что это функция.

mapDispatchToProps является вторым... проблема там.

bindActionCreators - не что иное, как цикл for... оставьте это, и вы лучше поймете, что происходит.

Попробуйте следующее:

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, синтаксис будет выглядеть следующим образом:

 function mapDispathToProps(dispatch){
   return {
     actions: bindActionCreators({
       action1,     
       action2,
     }, dispatch)
   }
 }

Кроме того, используйте const вместо let... вы не переопределяете значение. Также лучше экспортировать подключенный компонент под другим именем, чем имя класса компонента.

Ответ 2

В вашей функции mpdt вам нужно вернуть результат вызова bindActionCreators, а не объект с ключом действия.

Итак, это должно быть

const mdtp = (dispatch) => {
  return bindActionCreators({
    action1, action2, action3
  }, dispatch);
};

и вы можете назвать их как this.props.action1(...)

Из вашего кода также кажется, что вы путаете два способа передачи создателей действий компоненту. Один из способов описан выше. И другим способом, вы можете передать своих создателей действий непосредственно в connect() с использованием объектных обозначений, например

export default MainPage = connect(
   mapStateToProps,
   { action1, action2, action3 }
)(MainPage);

который будет иметь тот же результат. И ваш первый подход, используя sdtp action creator, использует этот подход.

Ответ 3

В качестве альтернативы вы также можете полностью пропустить mapDispatchToProps.

В вашей функции render() вы можете просто вызвать dispatch прямо следующим образом:

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

Затем в вашей функции connect вы можете полностью пропустить параметр mapDispatchToProps.

export default MainPage = connect(
   mapStateToProps
)(MainPage);

Я знаю, что это не ответ, но это просто альтернатива, которая работает также