Kurs Angular · Moduł 10: Zarządzanie stanem

Klasyczny NgRx Store

2 min czytania ·
W tej lekcji3

NgRx Store to wzorzec Redux dla Angular - potężny, ale bardziej złożony.

Struktura NgRx

store/
├── samurai.actions.ts    # Akcje
├── samurai.reducer.ts    # Reducer
├── samurai.selectors.ts  # Selektory
├── samurai.effects.ts    # Efekty (side effects)
└── samurai.state.ts      # Interfejs stanu

Actions

import { createAction, props } from '@ngrx/store';

// Ładowanie
export const loadSamurai = createAction('[Samurai] Load');
export const loadSamuraiSuccess = createAction(
  '[Samurai] Load Success',
  props<{ samurai: Samurai[] }>()
);
export const loadSamuraiFailure = createAction(
  '[Samurai] Load Failure',
  props<{ error: string }>()
);

// CRUD
export const addSamurai = createAction(
  '[Samurai] Add',
  props<{ samurai: Samurai }>()
);

export const deleteSamurai = createAction(
  '[Samurai] Delete',
  props<{ id: number }>()
);

Reducer

import { createReducer, on } from '@ngrx/store';

export interface SamuraiState {
  samurai: Samurai[];
  loading: boolean;
  error: string | null;
}

const initialState: SamuraiState = {
  samurai: [],
  loading: false,
  error: null
};

export const samuraiReducer = createReducer(
  initialState,

  on(loadSamurai, (state) => ({
    ...state,
    loading: true,
    error: null
  })),

  on(loadSamuraiSuccess, (state, { samurai }) => ({
    ...state,
    samurai,
    loading: false
  })),

  on(loadSamuraiFailure, (state, { error }) => ({
    ...state,
    loading: false,
    error
  })),

  on(addSamurai, (state, { samurai }) => ({
    ...state,
    samurai: [...state.samurai, samurai]
  })),

  on(deleteSamurai, (state, { id }) => ({
    ...state,
    samurai: state.samurai.filter(s => s.id !== id)
  }))
);

Widzisz błąd w tej lekcji?

Sprawdź się

Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.

  1. 1. Co reprezentuje Action w NgRx?

  2. 2. Co robi Reducer w NgRx, gdy otrzyma akcję?

To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.

Zadania praktyczne w grze

  • Edytor kodu

    Uzupełnij akcje i reducer dla zarządzania samurajami w NgRx.

  • Układanie w poziomie

    Ułóż wywołanie createAction z typem akcji i props (jedna linia, od lewej do prawej):

  • Układanie w pionie

    Uporządkuj akcje opisujące przebieg ładowania danych w NgRx (od rozpoczęcia do zakończenia):

  • Układanie w pionie

    Uporządkuj przepływ jednokierunkowy w klasycznym NgRx (od zdarzenia do widoku):

Przydatne artykuły