У меня есть приложение React с использованием Redux, на данный момент есть 3 редюсера — Event, Attendee, Locations. У нас есть действия по добавлению/изменению/удалению всех 3 редюсеров.
Все идет нормально.
Теперь проблема в том, что у меня есть много состояний пользовательского интерфейса, таких как showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner и многие другие. Мне нужно было бы создать действия для управления всеми этими флагами, так как многие из них основаны на результате избыточного преобразования. то есть: показывать счетчик при отправке запроса, переключать isError при получении ошибки с сервера... и т. д.
Я уверен, что есть какой-то элегантный способ справиться с этим?
но опять же я бы закончил со многими действиями вроде - showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner...
Нет, если у вас есть одно действие, которое отправляет {type: 'setUIFlag', payload 'showAddEventPopup'}, и вы просто возвращаете новое состояние только с измененным свойством полезной нагрузки.
Ах, понял, и у меня были бы все состояния в редюсерах - showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner... которыми бы манипулировал редуктор, и я мог бы отобразить их в компонентах





Как мы обсуждали в комментариях, у вас может быть состояние, которое выглядит так:
store = {
event: <state>
attendee: <state>
locations: <state>,
uiFlags: {
showAddEventPopup: false,
showEditEventPopup: false,
isEventAddingSpinner: false,
isEditingSpinner: false
}
}
С редуктором uiFlags, например:
const getDefaultState => ({
showAddEventPopup: false,
showEditEventPopup: false,
isEventAddingSpinner: false,
isEditingSpinner: false
});
export const ACTION = {
ENABLE_FLAG: 'enableUiFlag'
DISABLE_FLAG: 'disableUiFlag',
TOGGLE_FLAG: 'toggleUiFlag',
RESET_ALL_FLAGS: 'resetUiFlags'
}
const reducer (state = getDefaultState(), action = {}) => {
const {type, payload} = action;
if (!payload) return state;
switch(type) {
case ACTION.ENABLE_FLAG: {
return {
...state,
[payload]: true
}
}
case ACTION.DISABLE_FLAG: {
return {
...state,
[payload]: false
}
}
case ACTION.TOGGLE_FLAG: {
return {
...state,
[payload]: !state[payload]
}
}
case ACTION.RESET_ALL_FLAGS: {
return getDefaultState();
}
default: {
return state;
}
}
}
С преобразователь, как:
import {ACTIONS} from './ui-flag-reducer'
function enableUiFlag(flagType) {
return dispatch => {
dispatch({
type: ACTION.ENABLE_FLAG,
payload: 'showEditEventPopup'
})
};
}
Просто создайте еще один редуктор —
uiFlags— с ключом по имени флага. Отправляйте свои действия, потребляйте в своих редьюсерах и используйте селекторы, чтобы показать спинни.