• SAP 电商云 Spartacus UI Store 相关的设计明细


    Store

    state.ts

    定义了和 Site Context 业务相关的 State 数据模型。

    定义数据模型的套路是:

    export const SITE_CONTEXT_FEATURE = 'siteContext';
    
    export interface StateWithSiteContext {
      [SITE_CONTEXT_FEATURE]: SiteContextState;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这是最顶层的 State 模型了。

    SiteContextState 包含了三个子 State:

    export interface SiteContextState {
      languages: LanguagesState;
      currencies: CurrenciesState;
      baseSite: BaseSiteState;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以 CurrenciesState 为例,不仅包含了 Entities 列表,还包含了当前 Active 状态的 Currency:

    export interface CurrenciesState {
      entities: CurrencyEntities;
      activeCurrency: string;
    }
    
    • 1
    • 2
    • 3
    • 4

    再定义 Entities 列表:

    export interface CurrencyEntities {
      [isocode: string]: Currency;
    }
    
    • 1
    • 2
    • 3

    以上就是 Site Context 领域所需的 State 数据结构。

    注意 SITE_CONTEXT_FEATURE 的使用场合,除了本文件定义 feature state 之外,还用在下列两个文件内:

    场景1:用来创建 feature selector:

    场景2:使用 StoreModule.forFeature 注册 store:

    当使用 createSelector 和 createFeatureSelector 函数时,@ngrx/store 会跟踪调用选择器函数的最新参数。 因为选择器是纯函数,所以当参数匹配时可以返回最后一个结果,而无需重新调用选择器函数。 这可以提供性能优势,特别是对于执行昂贵计算的选择器。这种做法称为 memoization.

    createFeatureSelector 是返回顶级(Top Level)的 Feature State的便捷方法。 它为状态的特征切片(Feature Slice)返回一个类型化(typed)的选择器函数。

    注意 createFeatureSelector 的调用有两种写法。

    写法1

    下图 2 必须是 1 的一个切片,并且 3 的类型必须和 2 的类型一致:

    2 的位置其实就是 result 的位置:

    写法2

    import { createSelector, createFeatureSelector } from '@ngrx/store';
     
    export const featureKey = 'feature';
     
    export interface FeatureState {
      counter: number;
    }
     
    export interface AppState {
      feature: FeatureState;
    }
     
    export const selectFeature = createFeatureSelector<AppState, FeatureState>(featureKey);
     
    export const selectFeatureCount = createSelector(
      selectFeature,
      (state: FeatureState) => state.counter
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    我做过测试,在 SAP 电商云 Spartacus UI 项目里,两种写法完全等价:

    可以顺利通过编译:

  • 相关阅读:
    酷安官网下载页前端自适应源码
    【进阶篇】使用 Stream 流和 Lambda 组装复杂父子树形结构
    SSM-XML整合
    华为22级专家十年心血终成云原生服务网格进阶实战文档,是真的6
    TiDB Lightning 错误处理功能
    启山智软/商城源码
    监控Android Looper Message调度的另一种姿势
    rman 恢复数据报ORA-19573: cannot obtain exclusive enqueue for ...
    src实战-两处nacos未授权访问
    Spring中事务的传播行为有哪些?
  • 原文地址:https://blog.csdn.net/i042416/article/details/125897272