掌握 createSelector:了解 NgRx Store 的状态选择器
2023-09-25 21:47:12
NgRx Store createSelector 的单步调试和源代码分析
在 NgRx 应用程序中,Store 管理着整个应用程序的状态。为了高效地从 Store 中提取特定数据,NgRx 提供了 createSelector
函数。本文将深入探讨 createSelector
,逐步调试其内部机制,并分析其源代码,以帮助你更深入地理解它的工作原理。
NgRx createSelector
的概览
createSelector
是一个函数,用于从 Store 中创建一个新的选择器函数。它接受两个参数:
- 项目函数 (Projector Function) :用于从 Store 状态中提取特定数据的函数。
- 依赖项选择器数组 (Array of Dependency Selectors) :用于提供给项目函数的 Store 状态切片。
调试 createSelector
让我们通过一个简单的示例来逐步调试 createSelector
:
import { createSelector } from '@ngrx/store';
const selectCount = createSelector(
(state) => state.counter.count,
(count) => count * 2
);
-
调用
createSelector
函数 :第一步是调用createSelector
函数,传入项目函数和依赖项选择器数组。 -
评估依赖项选择器 :接下来,NgRx 评估依赖项选择器数组,并从 Store 中提取相应的状态切片。
-
调用项目函数 :评估依赖项选择器后,NgRx 调用项目函数,将提取的状态切片作为参数传递。
-
缓存结果 :默认情况下,
createSelector
将项目函数的结果缓存起来。这意味着,如果状态没有改变,即使 Store 发生更新,项目函数也不会再次调用。
分析源代码
让我们深入 createSelector
的源代码以更好地理解其内部工作原理:
export function createSelector<State, Result>(
...paths: MemoizedSelector<State, Result>[]
): MemoizedSelector<State, Result>;
export function createSelector<State, Result>(
projector: (state: State) => Result,
...paths: MemoizedSelector<State, any>[]
): MemoizedSelector<State, Result>;
createSelector
函数接受可变数量的参数。它可以以两种方式调用:
-
传入 MemoizedSelector 数组 :当传入一个 MemoizedSelector 数组时,
createSelector
返回一个新的 MemoizedSelector,该 MemoizedSelector 将所有传入的 MemoizedSelector 作为依赖项。 -
传入项目函数 :当传入一个项目函数时,
createSelector
返回一个新的 MemoizedSelector,该 MemoizedSelector 接受一个额外的依赖项选择器数组参数。