NgRx Ducks
  • Introduction
  • @ngrx-ducks/core
    • Installation
    • Architecture
      • @StoreChunk
      • createDuck
      • getReducer
      • createMutableDuck
      • getMutableReducer
      • useSelect
      • useSelectors
      • useActions
    • Guides
      • Quick Start
  • Migrations
    • v15
  • Resources
  • FAQ
  • GitHub
  • Changelog
  • Sponsor
Powered by GitBook
On this page
  • Generate the reducer function
  • Inlining

Was this helpful?

  1. @ngrx-ducks/core
  2. Architecture

getReducer

PreviouscreateDuckNextcreateMutableDuck

Last updated 3 years ago

Was this helpful?

Generate the reducer function

From a facade all case-reducers are extracted and combined into a single reducer function by using getReducer.

Since a reducer expects an initial state, getReducer needs the initial state to be passed as well as the class token of the respective facade.

The generated reducer can then be registered in NgRx's action reducer map (see index.ts).

Please refer to the to see a full example.

import { getReducer, StoreFacade } from '@ngrx-ducks/core';

import { GreetingState } from './greeting.state';

@StoreChunk()
export class Chunk {
  // createDuck, bindSelectors, usePick ....
}

const initialState: GreetingState = { greetings: [] };

export const facadeReducer = getReducer(initialState, Chunk);
import { Action, combineReducers } from '@ngrx/store';
import { facadeReducer } from './facade';
import { GreetingState } from './greeting.state';

export interface State {
  greeting: GreetingState;
}

export function reducers(state: State, action: Action) {
  return combineReducers<State>({
    greeting: facadeReducer
  })(state, action);
}
import { NgModule } from '@angular/core';

import { CommonModule } from '@angular/common';

import { EffectsModule } from '@ngrx/effects';
import { StoreModule } from '@ngrx/store';

import { reducers } from './index';

@NgModule({
  imports: [
    CommonModule,
     StoreModule.forFeature('feature-a', reducers)
  ],
  // ...
})
export class CounterModule { }
export interface GreetingState {
  greetings: string[];
}

Inlining

You also can inline getReducer in your Facade holding everything together. It's up to you which style you prefer. The benefit of inlining is, that the Facade becomes the only thing you import somewhere else.

import { getReducer, StoreFacade } from '@ngrx-ducks/core';

import { GreetingState } from './greeting.state';

const initialState: GreetingState = { greetings: [] };

@StoreFacade()
export class Facade {
  static reducer = getReducer(initialState, Facade);
  
  // createDuck, bindSelectors, usePick ....
}
import { Action, combineReducers } from '@ngrx/store';
import { Facade } from './facade';
import { GreetingState } from './greeting.state';

export interface State {
  greeting: GreetingState;
}

export function reducers(state: State, action: Action) {
  return combineReducers<State>({
    greeting: Facade.reducer
  })(state, action);
}
demo on StackBlitz