Верните обещание для простого создателя действий в react, используя react-redux

#javascript #reactjs #redux

#javascript #reactjs #redux

Вопрос:

Я новичок в react-redux . Здесь, я думаю, это очень простой вопрос. Но у меня есть создатель действий, и я использую функцию redux.

 export const updateActivePage = (activePage) => {
  return {
    type: UPDATE_ACTIVEPAGE,
    payload: activePage
  }
}
  

что я пробовал, так это

 export const updateActivePage = (activePage) => (dispatch) => {
  return new Promise( function(resolve, reject) {
    dispatch({
      type: UPDATE_ACTIVEPAGE,
      payload: activePage
    })
  })
}
  

функция после then не вызывается.

Теперь, на мой componentdidmount взгляд, я хочу использовать .then после этого

Итак, для этого я хочу вернуть обещание . Итак, как я могу это сделать? Я использую reux-thunk

Комментарии:

1. Это не асинхронная операция, нет смысла использовать promise. Просто напишите свою следующую команду в следующей строке.

2. Прочитайте об асинхронных действиях — alligator.io/redux/redux-thunk

3. Если я добавлю его во вторую строку, получит ли оно обновленное значение props для действия в следующей строке

Ответ №1:

Прямо из redux-thunk readme:

 function makeASandwichWithSecretSauce(forPerson) {
  // We can invert control here by returning a function - the "thunk".
  // When this function is passed to `dispatch`, the thunk middleware will intercept it,
  // and call it with `dispatch` and `getState` as arguments. 
  // This gives the thunk function the ability to run some logic, and still interact with the store.
  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

...

// It even takes care to return the thunk’s return value
// from the dispatch, so I can chain Promises as long as I return them.

store.dispatch(
  makeASandwichWithSecretSauce('My partner')
).then(() => {
  console.log('Done!');
});
  

Ответ №2:

Обещания скорее используются, когда вы хотите получить некоторые данные из внешнего источника (например, REST). Однако, если вы действительно хотите это сделать, создатель действия должен вернуть функцию:

 export const updateActivePage = (activePage) => {
  return (dispatch) => {
    return dispatch ({
      type: UPDATE_ACTIVEPAGE,
      payload: activePage
    });
  }
}

  

Что-то вроде этого должно вернуть обещание.
Однако это обещание будет выполнено при отправке действия. Это не то же самое, что изменение состояния redux. Я думаю, что вы на самом деле не хотите использовать promise здесь.

Если вы хотите реагировать, когда что-то в состоянии redux изменяется, ваш компонент должен наблюдать за состоянием (используя mapStateToProps), и вы можете обрабатывать изменения в componentWillUpdate методе.

Комментарии:

1. Я тоже пробовал это. но он говорит, что это не функция

2. this.props.updateActivePage(…).then не является функцией

3. Вы уверены, что этот Thunk вообще работает? Видите ли вы действие UPDATE_ACTIVEPAGE, отправленное и обработанное редуктором? Может быть, у вас проблема с конфигурацией?

4. handlePageChange = (номер страницы) => { this.props.updateActivePage(номер страницы).then(() => { this.props.fetchUserJd(this.props.activePage — 1); }); }

5. thunk не следует использовать таким образом. Просто используйте componentWillReceiveProps: componentWillReceiveProps(nextProps){ this.props.fetchUserJd(nextProps.activePage - 1); }