createSelectorCreator
接受一个 memoize
函数和 ...memoizeOptions
剩余参数,或者从 5.0.0 开始接受一个包含 memoize
函数的 options
对象,并创建一个自定义的选择器创建函数。
参数 (从 5.0.0 开始)
名称 | 描述 |
---|---|
options | 一个包含 memoize 函数的选项对象,该函数负责在 createSelector 内部对 resultFunc 进行记忆化(例如,lruMemoize 或 weakMapMemoize )。它还提供了额外的选项用于自定义记忆化。虽然 memoize 属性是必需的,但其余的都是可选的。 |
options.argsMemoize? | 用于记忆化由 createSelector 生成的 output selector 接收的参数的可选记忆化函数(例如,lruMemoize 或 weakMapMemoize )。默认值 = 5.0.0 之前为 lruMemoize ,之后为 weakMapMemoize |
options.argsMemoizeOptions? | argsMemoize 函数的可选配置选项。这些选项作为第二个参数传递给 argsMemoize 函数。从 5.0.0 开始 |
options.inputStabilityCheck? | 覆盖选择器的全局输入稳定性检查。可能的值包括:once - 只在选择器第一次被调用时运行。always - 每次选择器被调用时都运行。never - 从不运行输入稳定性检查。默认值 = 'once' 从 5.0.0 开始 |
options.memoize | 用于在 createSelector 内部对 resultFunc 进行记忆化的记忆化函数(例如,lruMemoize 或 weakMapMemoize )。从 5.0.0 开始 |
options.memoizeOptions? | memoize 函数的可选配置选项。这些选项作为第二个参数传递给 memoize 函数。从 5.0.0 开始 |
参数
名称 | 描述 |
---|---|
memoize | 负责在 createSelector 内部对 resultFunc 进行记忆化的 memoize 函数(例如,lruMemoize 或 weakMapMemoize )。 |
...memoizeOptionsFromArgs | 记忆化函数的可选配置选项。这些选项然后作为第二个参数传递给记忆化函数。 |
返回值
一个定制的 createSelector
函数。
类型参数
名称 | 描述 |
---|---|
MemoizeFunction | 用于在 createSelector 内部对 resultFunc 进行记忆化的记忆化函数的类型(例如,lruMemoize 或 weakMapMemoize )。 |
ArgsMemoizeFunction | 用于记忆化由 createSelector 生成的 output selector 接收的参数的可选记忆化函数的类型(例如,lruMemoize 或 weakMapMemoize )。如果没有明确提供,将使用 lruMemoize 。 |
示例
使用 options
(从 5.0.0 开始)
const customCreateSelector = createSelectorCreator({
memoize: customMemoize, // 用于记忆化 `resultFunc` 的函数
memoizeOptions: [memoizeOption1, memoizeOption2], // 作为第二个参数传递给 `customMemoize` 的选项
argsMemoize: customArgsMemoize, // 用于记忆化选择器的参数的函数
argsMemoizeOptions: [argsMemoizeOption1, argsMemoizeOption2] // 作为第二个参数传递给 `customArgsMemoize` 的选项
})
const customSelector = customCreateSelector(
[inputSelector1, inputSelector2],
resultFunc // `resultFunc` 将作为第一个参数传递给 `customMemoize`
)
customSelector(
...selectorArgs // 将由 `customArgsMemoize` 进行记忆化
)
使用 memoize
和 ...memoizeOptions
createSelectorCreator
可以用来创建一个定制版本的 createSelector
。
memoize
参数是一个用来替换默认配置的 memoizer 的 memoization 函数(通常是 weakMapMemoize
)。
...memoizeOptions
剩余参数是零个或多个要传递给 memoizeFunc
的配置选项。选择器的 resultFunc
作为第一个参数传递给 memoize
,memoizeOptions
作为第二个参数开始传递:
const customSelectorCreator = createSelectorCreator(
customMemoize, // 用于 memoize `resultFunc` 的函数
option1, // `option1` 将作为第二个参数传递给 `customMemoize`
option2, // `option2` 将作为第三个参数传递给 `customMemoize`
option3 // `option3` 将作为第四个参数传递给 `customMemoize`
)
const customSelector = customSelectorCreator(
[inputSelector1, inputSelector2],
resultFunc // `resultFunc` 将作为第一个参数传递给 `customMemoize`
)
在内部,customSelector
如下所示调用 memoize 函数:
customMemoize(resultFunc, option1, option2, option3)
额外的例子
为 lruMemoize
定制 equalityCheck
import { createSelectorCreator, lruMemoize } from 'reselect'
import isEqual from 'lodash.isequal'
// 创建一个使用 lodash.isequal 而不是 === 的 "selector creator"
const createDeepEqualSelector = createSelectorCreator(lruMemoize, isEqual)
// 使用新的 "selector creator" 创建一个选择器
const selectSum = createDeepEqualSelector(
[state => state.values.filter(val => val < 5)],
values => values.reduce((acc, val) => acc + val, 0)
)
使用 Lodash 的 memoize 函数进行无界缓存
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
)