Skip to main content

Reusing ngrx selectors to compose state

Author: @Phhansen

Reusing ngrx selectors to compose state

Here is an example of using NgRx selectors alongside @rx-angular/state to compose reusable state selectors.

Imagine the following ComponentState setup:

interface Item {
id: string;
name: string;
}

interface ComponentState {
items: { [id: string]: Item };
visibleIds: string[];
}

Now we want to derive a list of visible items based on all items and the array of visibleIds. We can do so by using the createSelector() function from NgRx.

const selectItems = (state: ComponentState) => state.items;

const selectVisibleIds = (state: ComponentState) => state.visibleIds;

const selectVisibleItems = createSelector(
selectVisibleIds,
selectItems,
(visibleIds, items) => visibleIds.map((id) => items[id])
);

Using this in our component will look like this:

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

@Component()
export class ItemListComponent extends RxState<ComponentState> {
readonly visibleItems$ = this.state.select(select(selectVisibleItems));

constructor() {
super();
}
}