unstable_autotrackMemoize
使用由Ember Glimmer团队启发的"自动跟踪"方法。它使用一个代理来包装参数,并在首次读取时跟踪对选择器中嵌套字段的访问。后来,当选择器被新的参数调用时,它会识别哪些访问的字段已经改变,并且只有当一个或多个被访问的字段改变时,才重新计算结果。这使得它比lruMemoize
中的浅等式检查更精确。
危险
这个API仍然是实验性的,正在进行测试。
设计权衡
-
优点:
- 它可能避免过多的计算,并且比
lruMemoize
重新计算的次数少,这也可能导致组件重新渲染的次数减少。
- 它可能避免过多的计算,并且比
-
缺点:
- 它只有一个缓存大小。
- 它比
lruMemoize
慢,因为它需要做更多的工作。(有多慢取决于选择器中访问的字段数量,调用次数,输入变化的频率等) - 它可能有一些意外的行为。因为它跟踪嵌套字段的访问,所以在你不访问一个字段的情况下,它将无法正确地重新计算。例如,一个写得不好的选择器像:
createSelector([state => state.todos], todos => todos)
那只是立即返回提取的值,将永远不会更新,因为它看不到任何字段访问来检查。
使用场景
- 它可能最适用于你需要访问数据中特定嵌套字段的情况,并且如果同一数据对象中的其他字段不可变地更新,避免重新计算。
参数
名称 | 描述 |
---|---|
func | 要被记忆的函数。 |
返回
一个带有 .clearCache()
方法的记忆函数。
类型参数
名称 | 描述 |
---|---|
Func | 被记忆的函数的类型。 |
示例
使用 unstable_autotrackMemoize
与 createSelector
- TypeScript
- JavaScript
unstable_autotrackMemoize/usingWithCreateSelector.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 }
)
unstable_autotrackMemoize/usingWithCreateSelector.js
import { createSelector, unstable_autotrackMemoize } from 'reselect'
const selectTodoIds = createSelector(
[state => state.todos],
todos => todos.map(todo => todo.id),
{ memoize: unstable_autotrackMemoize }
)
使用 unstable_autotrackMemoize
与 createSelectorCreator
- TypeScript
- JavaScript
unstable_autotrackMemoize/usingWithCreateSelectorCreator.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)
)
unstable_autotrackMemoize/usingWithCreateSelectorCreator.js
import { createSelectorCreator, unstable_autotrackMemoize } from 'reselect'
const createSelectorAutotrack = createSelectorCreator({
memoize: unstable_autotrackMemoize
})
const selectTodoIds = createSelectorAutotrack([state => state.todos], todos =>
todos.map(todo => todo.id)
)