NgRx с массивом

export class Ingredient {
    public name: string;
    public amount: number;

    constructor(name: string, amount: number) {
        this.name = name;
        this.amount = amount;
    }
}

Мой массив:

export const initialState2: Ingredient[] = [
  new Ingredient('Apples', 5),
  new Ingredient('Lemons', 10),
  new Ingredient('Cherries', 15),
  new Ingredient('Tangerines', 20),
  new Ingredient('Apricots', 25)
];

Мое действие NgRx:

export const ADD_INGREDIENT2 = createAction(
    'ADD_INGREDIENT2',
    props<{ ingredient: Ingredient }>()
);

И мой Редуктор:

export const shoppingListReducer = createReducer(
  initialState2,
  on(
    ShoppingListActions.ADD_INGREDIENT2,
    (state, ingredient) => ({ ...state, ingredients: [...state, ingredient] })
  )
);

Я прохожу курс по Angular. Я хочу сделать с новой версией, новым синтаксисом то, что было сделано со старой версией, используя переключатель/регистр в этом курсе.

У меня есть массив и я хочу работать с NgRx. Я хочу показать элементы внутри массива, а затем добавить новый элемент в массив. но я потерпел неудачу. Я, наверное, ошибаюсь с некоторыми типами. И мой код внизу страницы **работает**, но мой код в новой версии не работает.

Код в курсе: работает отлично

export const initialState = {
  ingredients: [
    new Ingredient('Apples', 5),
    new Ingredient('Lemons', 10),
    new Ingredient('Cherries', 15),
    new Ingredient('Tangerines', 20),
    new Ingredient('Apricots', 25)
  ]
};
________________________________________________________
export const ADD_INGREDIENT = 'ADD_INGREDIENT';

export class AddIngredient implements Action {
    readonly type = ADD_INGREDIENT;
    payload: Ingredient;
}
export function shoppingListReducer(state = initialState, action: ShoppingListActions.AddIngredient) {

  switch (action.type) {
    case ShoppingListActions.ADD_INGREDIENT:
      return { ...state, ingredients: [...state.ingredients, action.payload] };
    default:
      return state;
  }
}
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В вашем NgRx Reducer вы должны использовать назначение деструктурирования, чтобы распаковать ingredient свойство и добавить его в массив ingredients с помощью:

ingredients: [...state.ingredients, ingredient]

Код редуктора:

export const shoppingListReducer = createReducer(
  initialState2,
  on(ShoppingListActions.ADD_INGREDIENT2,
    (state, { ingredient }) => ({
      ...state,
      ingredients: [...state.ingredients, ingredient],
    })
  )
);

Спасибо. Рецепты не загружаются. Я пробовал это раньше.

Enes Ozmus 18.11.2022 21:50

Пожалуйста, попробуйте последнее обновление ответа

Yosvel Quintero 18.11.2022 21:52

Проблема в том, что вы используете другой тип данных.

Ваше состояние представляет собой массив, который обозначается []; Состояние курса — это объект, обозначаемый {};

{...} для объекта и [...] для массива. Это основная причина проблемы.

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