AngularNGXS不更新选择器,除非状态中的所选数据发生更改。
创始人
2024-10-28 18:31:22
0

使用memoization函数来保存上一次选择器的结果,并在数据变化时重新计算选择器。

示例代码:

import { createSelector } from '@ngxs/store';

export class MyStateModel {
  data: string[];
  selectedId: number;
}

export class MyState {
  @Selector()
  static selectedData(state: MyStateModel) {
    return state.data.find(d => d.id === state.selectedId);
  }
  
  @Selector()
  static otherData(state: MyStateModel) {
    const selectedData = MyState.selectedData(state); // 通过调用选择器获取所选数据
    // 处理其他数据
    return processedData;
  }

  @Action(UpdateSelection)
  updateSelection(ctx: StateContext, { selectionId }: UpdateSelection) {
    const state = ctx.getState();
    if (state.selectedId !== selectionId) {
      ctx.patchState({ selectedId: selectionId });
      MyState.otherData.release(); // 释放先前的memoization缓存
    }
  }
}

export function memoize(fn: (arg: T) => U): (arg: T) => U {
  let lastArg: T;
  let lastResult: U;
  return arg => {
    if (arg === lastArg) {
      return lastResult;
    }
    lastArg = arg;
    lastResult = fn(arg);
    return lastResult;
  };
}

// 创建一个选择器的memoize包装器
function memoizeSelector(selector: (arg: T) => U) {
  const memoizedSelector = createSelector(selector);
  return memoize(memoizedSelector);
}

// 在组件中使用memoizeSelector
export class MyComponent {
  selectedData$ = memoizeSelector(MyState.selectedData);
  otherData$ = memoizeSelector(MyState.otherData);

  constructor(private store: Store) {}

  updateSelection(id: number) {
    this.store.dispatch(new UpdateSelection(id));
  }
}

相关内容

热门资讯

玩家实测"杭州边锋辅... 玩家实测"杭州边锋辅助软件"开挂(透视)辅助神器(其实确实是有挂的)-哔哩哔哩;杭州边锋辅助软件最新...
第八分钟带你解说!白金岛手游辅... 第八分钟带你解说!白金岛手游辅助能干嘛(辅助挂)一贯真的有挂(新版有挂)-哔哩哔哩;白金岛手游辅助能...
一分钟了解"一起宁德... 一分钟了解"一起宁德钓蟹技巧"开挂(透视)辅助神器(果然真的有挂)-哔哩哔哩;一起宁德钓蟹技巧最新软...
技术分享"随意玩游戏... 技术分享"随意玩游戏平台官方挂开挂"开挂(透视)辅助安装(果然确实是有挂的)-哔哩哔哩,随意玩游戏平...
第一分钟带你介绍!四川皮皮辅助... 第一分钟带你介绍!四川皮皮辅助(辅助挂)一直确实有挂(有挂方略)-哔哩哔哩;是一款可以让一直输的玩家...
透视了解"来物局潮汕... 透视了解"来物局潮汕麻雀"开挂(透视)辅助下载(原来确实是有挂)-哔哩哔哩;致您一封信;亲爱来物局潮...
第十分钟带你得知!八闽状元郎辅... 第十分钟带你得知!八闽状元郎辅助器怎么用(辅助挂)一直确实有挂(存在有挂)-哔哩哔哩;AI辅助机器人...
推荐一款"微信h5辅... 推荐一款"微信h5辅助器"开挂(透视)辅助神器(原来确实有挂)-哔哩哔哩;微信h5辅助器AI智能教程...
透视神器"微信十三张... 透视神器"微信十三张脚本"开挂(透视)辅助工具(其实确实是有挂)-哔哩哔哩;致您一封信;亲爱微信十三...
七分钟带你得知!邯郸胡乐挂(辅... 七分钟带你得知!邯郸胡乐挂(辅助挂)其实有挂(真实有挂)-哔哩哔哩;邯郸胡乐挂软件透视开挂作为一款邯...