#reactjs #react-native #redux
#reactjs #react-native #redux
Вопрос:
export default async (state = INITIAL_STATE, action) => {
switch (action.type) {
//... Many other cases
CASE 'A':
CASE 'B':
CASE 'C':
CASE 'D':
CASE 'E':
{
//call http request for logging purpose
return { ...state, isLoadingFlag: true };
}
//Yes there is default case
}
}
У меня есть приведенный выше редуктор, который делает isLoadingFlag
true. Мне интересно, какой из них подходит к делу, поэтому я добавляю функцию удаленного ведения журнала в reducer
. Но, как ни странно, это действительно испортило состояние? потому что я больше не вижу, как отображается мой флаг загрузки.
Я не понимаю, почему это произошло, потому что вся забота редуктора заключается в возврате объекта состояния, теоретически говоря, это должно сработать, даже если мы добавим в него удаленный сетевой запрос, не так ли?
Дополнительная информация:
Причина вышеуказанной настройки в том, что каким-то образом мой Mac не смог обнаружить телефон Huawei в режиме adb, поэтому я не смог выполнить отладку на определенном устройстве.
Комментарии:
1. reducer не предназначен для ведения журнала. это для обновления хранилища redux.
2. @codekaizer: Конечно, это не так. Но я спрашивал, потому что, насколько я понимаю, пока мы возвращаем новое состояние, все должно быть в порядке
3. «пока мы возвращаем новое состояние, все должно быть в порядке», у вас есть вариант по умолчанию? в каком случае нужно установить
isLoadingFlag
значениеfalse
?4. @codekaizer: Я не включил весь редуктор. Но спасибо, поскольку я уже нашел ответ ниже
Ответ №1:
Я думаю, вам нужно удалить async
из инициализации вашей функции, потому что редукторы должны быть синхронизированы. В вашем случае редуктор возвращает обещание из-за async
.
Комментарии:
1. Да, вы правы! Я добавил,
async
потому что, естественно, добавилawait
для сетевого запроса. Но поскольку это всего лишь простое ведение журнала, я могу просто удалитьawait
для сетевого запроса. Потрясающее спасибо!
Ответ №2:
Reducer Redux должен быть чистой функцией, а не async
таковой.
Я думаю, вы используете reducer для неправильной цели. Reducer используется для описания того, как состояние приложения должно быть изменено на основе отправленного действия.
Для удаленного ведения журнала, пожалуйста, используйте промежуточное программное обеспечение или библиотеку асинхронной отправки, такую как redux-think
или redux-saga
.
Ответ №3:
Функции редуктора должны быть чистыми функциями. Вы можете разрешить свои асинхронные операции в actions and dispatch или использовать промежуточное программное обеспечение Redux (redux-thunk) для обработки асинхронных операций.
Пожалуйста, обратитесь https://redux.js.org/basics/reducers
Ответ №4:
На мой взгляд, вам следует использовать Redux-Sagas, и там вы можете определить 1 сагу, которая прослушивает все действия, или 1 сагу для каждого действия. Попробуйте.