跳到主要内容

createSelectorCreator

接受一个 memoize 函数和 ...memoizeOptions 剩余参数,或者从 5.0.0 开始接受一个包含 memoize 函数的 options 对象,并创建一个自定义的选择器创建函数。

参数 (从 5.0.0 开始)

名称描述
options一个包含 memoize 函数的选项对象,该函数负责在 createSelector 内部对 resultFunc 进行记忆化(例如,lruMemoizeweakMapMemoize)。它还提供了额外的选项用于自定义记忆化。虽然 memoize 属性是必需的,但其余的都是可选的。
options.argsMemoize?用于记忆化由 createSelector 生成的 output selector 接收的参数的可选记忆化函数(例如,lruMemoizeweakMapMemoize)。
默认值 = 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 进行记忆化的记忆化函数(例如,lruMemoizeweakMapMemoize)。从 5.0.0 开始
options.memoizeOptions?memoize 函数的可选配置选项。这些选项作为第二个参数传递给 memoize 函数。
从 5.0.0 开始

参数

名称描述
memoize负责在 createSelector 内部对 resultFunc 进行记忆化的 memoize 函数(例如,lruMemoizeweakMapMemoize)。
...memoizeOptionsFromArgs记忆化函数的可选配置选项。这些选项然后作为第二个参数传递给记忆化函数。

返回值

一个定制的 createSelector 函数。

类型参数

名称描述
MemoizeFunction用于在 createSelector 内部对 resultFunc 进行记忆化的记忆化函数的类型(例如,lruMemoizeweakMapMemoize)。
ArgsMemoizeFunction用于记忆化由 createSelector 生成的 output selector 接收的参数的可选记忆化函数的类型(例如,lruMemoizeweakMapMemoize)。如果没有明确提供,将使用 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 作为第一个参数传递给 memoizememoizeOptions 作为第二个参数开始传递:

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
)