During each navigation cycle, a RouterNavigationAction
is dispatched with a snapshot of the state in its payload, the RouterStateSnapshot
. The RouterStateSnapshot
is a large complex structure, containing many pieces of information about the current state and what's rendered by the router. This can cause performance
issues when used with the Store Devtools. In most cases, you may only need a piece of information from the RouterStateSnapshot
. In order to pair down the RouterStateSnapshot
provided during navigation, you provide a custom serializer for the snapshot to only return what you need to be added to the payload and store.
To use the time-traveling debugging in the Devtools, you must return an object containing the url
when using the routerReducer
.
import { StoreModule, ActionReducerMap } from '@ngrx/store';
import { Params, RouterStateSnapshot } from '@angular/router';
import {
StoreRouterConnectingModule,
routerReducer,
RouterReducerState,
RouterStateSerializer
} from '@ngrx/router-store';
export interface RouterStateUrl {
url: string;
queryParams: Params;
}
export interface State {
routerReducer: RouterReducerState<RouterStateUrl>;
}
export class CustomSerializer implements RouterStateSerializer<RouterStateUrl> {
serialize(routerState: RouterStateSnapshot): RouterStateUrl {
const { url } = routerState;
const queryParams = routerState.root.queryParams;
// Only return an object including the URL and query params
// instead of the entire snapshot
return { url, queryParams };
}
}
export const reducers: ActionReducerMap<State> = {
routerReducer: routerReducer
};
@NgModule({
imports: [
StoreModule.forRoot(reducers),
RouterModule.forRoot([
// routes
]),
StoreRouterConnectingModule
],
providers: [
{ provide: RouterStateSerializer, useClass: CustomSerializer }
]
})
export class AppModule { }