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