Программный доступ к значениям в состоянии NGRX

#angular #rxjs #ngrx

#angular #rxjs #ngrx

Вопрос:

У меня есть настройка состояния NGRX, которая является объектом значений. Ключи значений представляют собой числа (1-5) с логическим значением.

state.ts

 export interface State {
  1: boolean;
  2: boolean;
  3: boolean;
  4: boolean;
  5: boolean;
}

export const initialState: State = {
  1: true,
  2: true,
  3: true,
  4: true,
  5: true,
}
 

У меня также есть действие, которое передает через него значение номера объекта. Итак, в моем редукторе я беру числовое значение, нахожу это значение в объекте и переключаю логическое значение. Однако я сталкиваюсь с проблемой, из-за которой я не могу выбрать ключ объекта в своей функции редуктора, фактически не вводя физическое число.

action.ts

 export const changeButtonState = createAction(
  '[Bingo Actions] Change Button State',
  (payload: number) => ({payload}),
);
 

reducer.ts

 export const reducer = createReducer(
  initialState,
  on(BingoActions.changeButtonState, (state, action) => {
    return {
      ...state,
      action.payload: !state[action.payload],
    };
  })
);
 

Как я могу получить доступ к числовому значению объекта без необходимости физического ввода числа в функции редуктора?

Ответ №1:

Забыл, что это был объект в состоянии, и просто нужно было настроить редуктор, чтобы добавить скобку вокруг действия.назначение полезной нагрузки.

Обновлен reducer.ts

 export const reducer = createReducer(
  initialState,
  on(BingoActions.changeButtonState, (state, action) => {
    return {
      ...state,
      [action.payload]: !state[action.payload],
    };
  })
);
 

Ответ №2:

Вычисленные имена свойств для ключей вашего объектаhttps://ui.dev/computed-property-names /

 export const stateKeys = {
  one: 1,
  two: 2,
  ...
 
 export interface State {
  [stateKeys.one]: boolean;
  [stateKeys.two]: boolean;
...
 

Затем для доступа к свойству с вычисляемым именем внутри вашего редуктора синтаксис:

 state[stateKeys.one]