website/docs/api/unstable_autotrackMemoize.mdx
import Tabs from '@theme/Tabs' import TabItem from '@theme/TabItem' import { InternalLinks } from '@site/src/components/InternalLinks'
unstable_autotrackMemoizeUses an "auto-tracking" approach inspired by the work of the Ember Glimmer team. It uses a Proxy to wrap arguments and track accesses to nested fields in your selector on first read. Later, when the selector is called with new arguments, it identifies which accessed fields have changed and only recalculates the result if one or more of those accessed fields have changed. This allows it to be more precise than the shallow equality checks in lruMemoize.
:::danger
This API is still experimental and undergoing testing.
:::
Pros:
lruMemoize will, which may also result in fewer component re-renders.Cons:
lruMemoize, because it has to do more work. (How much slower is dependent on the number of accessed fields in a selector, number of calls, frequency of input changes, etc)createSelector([state => state.todos], todos => todos)
that just immediately returns the extracted value will never update, because it doesn't see any field accesses to check.
| Name | Description |
|---|---|
func | The function to be memoized. |
A memoized function with a .clearCache() method attached.
| Name | Description |
|---|---|
Func | The type of the function that is memoized. |
unstable_autotrackMemoize with createSelector<Tabs groupId='language' defaultValue='ts' values={[ {label: 'TypeScript', value: 'ts'}, {label: 'JavaScript', value: 'js'}, ]}> <TabItem value='ts'>
import { createSelector, unstable_autotrackMemoize } from 'reselect'
export interface RootState {
todos: { id: number; completed: boolean }[]
alerts: { id: number; read: boolean }[]
}
const selectTodoIds = createSelector(
[(state: RootState) => state.todos],
todos => todos.map(todo => todo.id),
{ memoize: unstable_autotrackMemoize }
)
import { createSelector, unstable_autotrackMemoize } from 'reselect'
const selectTodoIds = createSelector(
[state => state.todos],
todos => todos.map(todo => todo.id),
{ memoize: unstable_autotrackMemoize }
)
unstable_autotrackMemoize with createSelectorCreator<Tabs groupId='language' defaultValue='ts' values={[ {label: 'TypeScript', value: 'ts'}, {label: 'JavaScript', value: 'js'}, ]}> <TabItem value='ts'>
import { createSelectorCreator, unstable_autotrackMemoize } from 'reselect'
import type { RootState } from './usingWithCreateSelector'
const createSelectorAutotrack = createSelectorCreator({
memoize: unstable_autotrackMemoize
})
const selectTodoIds = createSelectorAutotrack(
[(state: RootState) => state.todos],
todos => todos.map(todo => todo.id)
)
import { createSelectorCreator, unstable_autotrackMemoize } from 'reselect'
const createSelectorAutotrack = createSelectorCreator({
memoize: unstable_autotrackMemoize
})
const selectTodoIds = createSelectorAutotrack([state => state.todos], todos =>
todos.map(todo => todo.id)
)