跳到主要内容

lruMemoize

这是一个使用提供的等价性检查函数来比较其输入的记忆化函数。这最初被称为 defaultMemoize,并且在4.x版本之前是createSelector的默认设置。

它的默认缓存大小为1。这意味着当参数的值发生变化时,它总是会重新计算。然而,可以根据需要使用特定的最大缓存大小进行自定义(自4.1.0版本以来)。

它通过调用 equalityCheck 函数来判断参数是否发生了变化。由于 lruMemoize 设计用于处理不可变数据,因此默认的 equalityCheck 函数使用引用等价性来检查变化:

lruMemoize/referenceEqualityCheck.ts
const referenceEqualityCheck = (previousValue: any, currentValue: any) => {
return previousValue === currentValue
}

参数

名称描述
func需要被记忆化的函数。
equalityCheckOrOptions一个等式检查函数或者一个options对象。

从4.1.0版本开始,lruMemoize也接受一个选项对象作为其第一个参数,而不是一个equalityCheck函数。options对象可能包含:

type EqualityFn<T = any> = (a: T, b: T) => boolean

interface LruMemoizeOptions<Result = any> {
equalityCheck?: EqualityFn
resultEqualityCheck?: EqualityFn<Result>
maxSize?: number
}
名称描述
equalityCheck用于比较提供的计算函数的各个参数。
默认值 = defaultEqualityCheck
resultEqualityCheck如果提供,用于将新生成的输出值与缓存中的旧值进行比较。如果找到匹配,将返回旧值。这解决了常见的todos.map(todo => todo.id)用例,其中原始数据中的其他字段的更新由于引用的改变而导致重新计算,但输出仍然有效地相同。
maxSize选择器的缓存大小。如果大于1,选择器将内部使用LRU缓存。
默认值 = 1
注意

如果在argsMemoizeOptions中使用resultEqualityCheck,它将不起作用。

返回值

一个带有.clearCache()方法的记忆化函数。

类型参数

名称描述
Func被记忆化函数的类型。

示例

使用lruMemoizecreateSelector

lruMemoize/usingWithCreateSelector.ts
import { shallowEqual } from 'react-redux'
import { createSelector, lruMemoize } from 'reselect'

export interface RootState {
todos: {
id: number
completed: boolean
title: string
description: string
}[]
alerts: { id: number; read: boolean }[]
}

const selectTodoIds = createSelector(
[(state: RootState) => state.todos],
todos => todos.map(todo => todo.id),
{
memoize: lruMemoize,
memoizeOptions: {
equalityCheck: shallowEqual,
resultEqualityCheck: shallowEqual,
maxSize: 10
},
argsMemoize: lruMemoize,
argsMemoizeOptions: {
equalityCheck: shallowEqual,
resultEqualityCheck: shallowEqual,
maxSize: 10
}
}
)

使用 lruMemoizecreateSelectorCreator

lruMemoize/usingWithCreateSelectorCreator.ts
import { shallowEqual } from 'react-redux'
import { createSelectorCreator, lruMemoize } from 'reselect'

export interface RootState {
todos: {
id: number
completed: boolean
title: string
description: string
}[]
alerts: { id: number; read: boolean }[]
}

const createSelectorShallowEqual = createSelectorCreator({
memoize: lruMemoize,
memoizeOptions: {
equalityCheck: shallowEqual,
resultEqualityCheck: shallowEqual,
maxSize: 10
},
argsMemoize: lruMemoize,
argsMemoizeOptions: {
equalityCheck: shallowEqual,
resultEqualityCheck: shallowEqual,
maxSize: 10
}
})

const selectTodoIds = createSelectorShallowEqual(
[(state: RootState) => state.todos],
todos => todos.map(todo => todo.id)
)