下载 NgRx

  1. npm install @ngrx/store @ngrx/effects @ngrx/entity @ngrx/router-store @ngrx/store-devtools @ngrx/schematics

配置 NgRx CLI

  1. ng config cli.defaultCollection @ngrx/schematics
  1. // angular.json
  2. "cli": {
  3. "defaultCollection": "@ngrx/schematics"
  4. }

创建 Store

  1. ng g store State --root --module app.module.ts --statePath store --stateInterface AppState

创建 Action

  1. ng g action store/actions/counter --skipTests
  1. import { createAction } from "@ngrx/store"
  2. export const increment = createAction("increment")
  3. export const decrement = createAction("decrement")

创建 Reducer

  1. ng g reducer store/reducers/counter --skipTests --reducers=../index.ts
  1. import { createReducer, on } from "@ngrx/store"
  2. import { decrement, increment } from "../actions/counter.actions"
  3. export const counterFeatureKey = "counter"
  4. export interface State {
  5. count: number
  6. }
  7. export const initialState: State = {
  8. count: 0
  9. }
  10. export const reducer = createReducer(
  11. initialState,
  12. on(increment, state => ({ count: state.count + 1 })),
  13. on(decrement, state => ({ count: state.count - 1 }))
  14. )

创建 Selector

  1. ng g selector store/selectors/counter --skipTests
  1. import { createFeatureSelector, createSelector } from "@ngrx/store"
  2. import { counterFeatureKey, State } from "../reducers/counter.reducer"
  3. import { AppState } from ".."
  4. export const selectCounter = createFeatureSelector<AppState, State>(counterFeatureKey)
  5. export const selectCount = createSelector(selectCounter, state => state.count)

组件类触发 Action、获取状态

  1. import { select, Store } from "@ngrx/store"
  2. import { Observable } from "rxjs"
  3. import { AppState } from "./store"
  4. import { decrement, increment } from "./store/actions/counter.actions"
  5. import { selectCount } from "./store/selectors/counter.selectors"
  6. export class AppComponent {
  7. count: Observable<number>
  8. constructor(private store: Store<AppState>) {
  9. this.count = this.store.pipe(select(selectCount))
  10. }
  11. increment() {
  12. this.store.dispatch(increment())
  13. }
  14. decrement() {
  15. this.store.dispatch(decrement())
  16. }
  17. }

组件模板显示状态

  1. <button (click)="increment()">+</button>
  2. <span>{{ count | async }}</span>
  3. <button (click)="decrement()">-</button>