返回

掌握 createSelector:了解 NgRx Store 的状态选择器

前端

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
);
  1. 调用 createSelector 函数 :第一步是调用 createSelector 函数,传入项目函数和依赖项选择器数组。

  2. 评估依赖项选择器 :接下来,NgRx 评估依赖项选择器数组,并从 Store 中提取相应的状态切片。

  3. 调用项目函数 :评估依赖项选择器后,NgRx 调用项目函数,将提取的状态切片作为参数传递。

  4. 缓存结果 :默认情况下,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 函数接受可变数量的参数。它可以以两种方式调用:

  1. 传入 MemoizedSelector 数组 :当传入一个 MemoizedSelector 数组时,createSelector 返回一个新的 MemoizedSelector,该 MemoizedSelector 将所有传入的 MemoizedSelector 作为依赖项。

  2. 传入项目函数 :当传入一个项目函数时,createSelector 返回一个新的 MemoizedSelector,该 MemoizedSelector 接受一个额外的依赖项选择器数组参数。

SEO优化