ngRx ------reducer

156 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

介绍

reducer 负责一个状态向另一个状态的转换. Reducer 方法通过决定去处理哪个action来实现这种转变

reducer 函数作用

reducer 管理state的有些共通点:

  • 一个定义state 类型的接口
  • state的初始值
  • reducder 参数:初始值或当前state和当前action
  • switch语句

例子:

首先,定义一个action,用来和state相互作用 scoreboard-page.actions.ts

import { Action } from '@ngrx/store';

export enum ActionTypes {
  IncrementHome = '[Scoreboard Page] Home Score',
  IncrementAway = '[Scoreboard Page] Away Score',
  Reset = '[Scoreboard Page] Score Reset',
}

export class IncrementHome implements Action {
  readonly type = ActionTypes.IncrementHome;
}

export class IncrementAway implements Action {
  readonly type = ActionTypes.IncrementAway;
}

export class Reset implements Action {
  readonly type = ActionTypes.Reset;

  constructor(public payload: { home: number; away: number }) {}
}

export type ActionsUnion = IncrementHome | IncrementAway | Reset;

其次,创建 scoreboard.reducer.ts

1, 定义state 类型和组成

import * as Scoreboard from '../actions/scoreboard-page.actions';

export interface State {
  home: number;
  away: number;
}

2, 设置state 初始值

export const initialState: State = {
    home: 0,
    away: 0,
};

3, 创建 reducer 方法,

export function reducer(
  state = initialState,
  action: Scoreboard.ActionsUnion
): State {
  switch (action.type) {
    case Scoreboard.ActionTypes.IncrementHome: {
      return {
        ...state,
        home: state.home + 1,
      };
    }

    case Scoreboard.ActionTypes.IncrementAway: {
      return {
        ...state,
        away: state.away + 1,
      };
    }

    case Scoreboard.ActionTypes.Reset: {
      return action.payload; // typed to { home: number, away: number }
    }

    default: {
      return state;
    }
  }
}