Performance: Selectors for derived state
This affects how quickly the UI updates when state changes and how much CPU is used during rendering.
Jump into concepts and practice - no test required
const selectActiveCount = createSelector( (state) => state.items, (items) => items.filter(item => item.active).length ); const derivedValue = store.select(selectActiveCount);
const derivedValue = store.select(state => { return state.items.filter(item => item.active).length; });
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Non-memoized selector | Many recalculations | Multiple reflows due to frequent updates | High paint cost from unnecessary renders | [X] Bad |
| Memoized selector with createSelector | Minimal recalculations | Single reflow per relevant state change | Lower paint cost from fewer renders | [OK] Good |
createSelector in Angular state management?createSelector doescreateSelector is used to create selectors that compute derived data from the state without modifying it.createSelector?createSelectorlist.length correctly gets the count.const selectItems = (state) => state.items;
const selectCompletedItems = createSelector(selectItems, items => items.filter(item => item.done));
selectCompletedItems return if state.items is [{done: true}, {done: false}, {done: true}]?selectItems returns the full list of items from state.item.done is true, so it keeps only those objects.const selectUsers = (state) => state.users;
const selectActiveUsers = createSelector(selectUsers, users => users.active);
selectUsers correctly returns state.users, which is valid.users.active, but users is likely an array, so it should filter or map, not access a property.const selectTasks = (state) => state.tasks;
createSelector implementations correctly derives this data?completed and pending correctly using parentheses to return the object literal.