Skip to main content

createSelectorCreator

Accepts either a memoize function and ...memoizeOptions rest parameter, or since 5.0.0 an options object containing a memoize function and creates a custom selector creator function.

Parameters (since 5.0.0)

NameDescription
optionsAn options object containing the memoize function responsible for memoizing the resultFunc inside createSelector (e.g., lruMemoize or weakMapMemoize). It also provides additional options for customizing memoization. While the memoize property is mandatory, the rest are optional.
options.argsMemoize?The optional memoize function that is used to memoize the arguments passed into the output selector generated by createSelector (e.g., lruMemoize or weakMapMemoize).
Default = lruMemoize before 5.0.0 and weakMapMemoize after
options.argsMemoizeOptions?Optional configuration options for the argsMemoize function. These options are passed to the argsMemoize function as the second argument.
since 5.0.0
options.inputStabilityCheck?Overrides the global input stability check for the selector. Possible values are:
once - Run only the first time the selector is called.
always - Run every time the selector is called.
never - Never run the input stability check.
Default = 'once'
since 5.0.0
options.memoizeThe memoize function that is used to memoize the resultFunc inside createSelector (e.g., lruMemoize or weakMapMemoize). since 5.0.0
options.memoizeOptions?Optional configuration options for the memoize function. These options are passed to the memoize function as the second argument.
since 5.0.0

Parameters

NameDescription
memoizeThe memoize function responsible for memoizing the resultFunc inside createSelector (e.g., lruMemoize or weakMapMemoize).
...memoizeOptionsFromArgsOptional configuration options for the memoization function. These options are then passed to the memoize function as the second argument onwards.

Returns

A customized createSelector function.

Type Parameters

NameDescription
MemoizeFunctionThe type of the memoize function that is used to memoize the resultFunc inside createSelector (e.g., lruMemoize or weakMapMemoize).
ArgsMemoizeFunctionThe type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by createSelector (e.g., lruMemoize or weakMapMemoize). If none is explicitly provided, lruMemoize will be used.

Examples

Using options (since 5.0.0)

const customCreateSelector = createSelectorCreator({
memoize: customMemoize, // Function to be used to memoize `resultFunc`
memoizeOptions: [memoizeOption1, memoizeOption2], // Options passed to `customMemoize` as the second argument onwards
argsMemoize: customArgsMemoize, // Function to be used to memoize the selector's arguments
argsMemoizeOptions: [argsMemoizeOption1, argsMemoizeOption2] // Options passed to `customArgsMemoize` as the second argument onwards
})

const customSelector = customCreateSelector(
[inputSelector1, inputSelector2],
resultFunc // `resultFunc` will be passed as the first argument to `customMemoize`
)

customSelector(
...selectorArgs // Will be memoized by `customArgsMemoize`
)

Using memoize and ...memoizeOptions

createSelectorCreator can be used to make a customized version of createSelector.

The memoize argument is a memoization function to replace the default configured memoizer (normally weakMapMemoize).

The ...memoizeOptions rest parameters are zero or more configuration options to be passed to memoizeFunc. The selectors resultFunc is passed as the first argument to memoize and the memoizeOptions are passed as the second argument onwards:

const customSelectorCreator = createSelectorCreator(
customMemoize, // Function to be used to memoize `resultFunc`
option1, // `option1` will be passed as second argument to `customMemoize`
option2, // `option2` will be passed as third argument to `customMemoize`
option3 // `option3` will be passed as fourth argument to `customMemoize`
)

const customSelector = customSelectorCreator(
[inputSelector1, inputSelector2],
resultFunc // `resultFunc` will be passed as first argument to `customMemoize`
)

Internally customSelector calls the memoize function as follows:

customMemoize(resultFunc, option1, option2, option3)

Additional Examples

Customize equalityCheck for lruMemoize

import { createSelectorCreator, lruMemoize } from 'reselect'
import isEqual from 'lodash.isequal'

// create a "selector creator" that uses lodash.isequal instead of ===
const createDeepEqualSelector = createSelectorCreator(lruMemoize, isEqual)

// use the new "selector creator" to create a selector
const selectSum = createDeepEqualSelector(
[state => state.values.filter(val => val < 5)],
values => values.reduce((acc, val) => acc + val, 0)
)

Use memoize function from Lodash for an unbounded cache

import { createSelectorCreator } from 'reselect'
import memoize from 'lodash.memoize'

const hashFn = (...args) =>
args.reduce((acc, val) => acc + '-' + JSON.stringify(val), '')

const customSelectorCreator = createSelectorCreator(memoize, hashFn)

const selector = customSelectorCreator(
[state => state.a, state => state.b],
(a, b) => a + b
)