Angular State Management ด้วย NgRx: Store, Actions, Reducers
#angular12 เม.ย. 2569
NgRx คืออะไร
NgRx เป็น state management library สำหรับ Angular ที่ได้รับแรงบันดาลใจจาก Redux ใช้ pattern Store → Action → Reducer → Selector
ติดตั้ง NgRx
npm install @ngrx/store @ngrx/effects @ngrx/entity
สร้าง Actions
// counter.actions.ts
import { createAction, props } from '@ngrx/store';
export const increment = createAction('[Counter] Increment');
export const decrement = createAction('[Counter] Decrement');
export const reset = createAction('[Counter] Reset');
export const loadUsers = createAction('[User] Load Users');
export const loadUsersSuccess = createAction(
'[User] Load Users Success',
props<{ users: User[] }>()
);
export const loadUsersFailure = createAction(
'[User] Load Users Failure',
props<{ error: string }>()
);
สร้าง Reducer
// counter.reducer.ts
import { createReducer, on } from '@ngrx/store';
export interface CounterState {
count: number;
}
const initialState: CounterState = { count: 0 };
export const counterReducer = createReducer(
initialState,
on(increment, state => ({ ...state, count: state.count + 1 })),
on(decrement, state => ({ ...state, count: state.count - 1 })),
on(reset, state => ({ ...state, count: 0 }))
);
สร้าง Selector
// counter.selectors.ts
import { createSelector, createFeatureSelector } from '@ngrx/store';
export const selectCounterState = createFeatureSelector<CounterState>('counter');
export const selectCount = createSelector(
selectCounterState,
state => state.count
);
ใช้ใน Component
import { Store } from '@ngrx/store';
export class CounterComponent {
count$ = this.store.select(selectCount);
constructor(private store: Store) {}
increment() { this.store.dispatch(increment()); }
decrement() { this.store.dispatch(decrement()); }
reset() { this.store.dispatch(reset()); }
}
สรุป
NgRx เหมาะกับ application ขนาดใหญ่ที่มี state ซับซ้อน ถ้า app เล็กอาจใช้ Service + Signal แทนได้ครับ