Управление состоянием пользовательского интерфейса в React Redux

У меня есть приложение React с использованием Redux, на данный момент есть 3 редюсера — Event, Attendee, Locations. У нас есть действия по добавлению/изменению/удалению всех 3 редюсеров.

Все идет нормально.

Теперь проблема в том, что у меня есть много состояний пользовательского интерфейса, таких как showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner и многие другие. Мне нужно было бы создать действия для управления всеми этими флагами, так как многие из них основаны на результате избыточного преобразования. то есть: показывать счетчик при отправке запроса, переключать isError при получении ошибки с сервера... и т. д.

Я уверен, что есть какой-то элегантный способ справиться с этим?

Просто создайте еще один редуктор — uiFlags — с ключом по имени флага. Отправляйте свои действия, потребляйте в своих редьюсерах и используйте селекторы, чтобы показать спинни.

lux 24.04.2019 16:34

но опять же я бы закончил со многими действиями вроде - showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner...

Gaurav_soni 24.04.2019 16:39

Нет, если у вас есть одно действие, которое отправляет {type: 'setUIFlag', payload 'showAddEventPopup'}, и вы просто возвращаете новое состояние только с измененным свойством полезной нагрузки.

lux 24.04.2019 16:41

Ах, понял, и у меня были бы все состояния в редюсерах - showAddEventPopup, ShowEditEventPopup, isEventAddingSpinner, isEditingSpinner... которыми бы манипулировал редуктор, и я мог бы отобразить их в компонентах

Gaurav_soni 24.04.2019 16:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как мы обсуждали в комментариях, у вас может быть состояние, которое выглядит так:

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

Другие вопросы по теме