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));
  }
}

相关内容

热门资讯

技巧知识分享透视器方法!中至山... 技巧知识分享透视器方法!中至山西麻将多功能透视器方法,中至山西麻将原来是真的有透视器方法1、玩家可以...
实测必看透视器app!老友汇多... 实测必看透视器app!老友汇多功能透视器app,老友汇切实是真的有透视器app1.老友汇 选牌创建新...
重大消息辅助方法!大唐麻将全集... 重大消息辅助方法!大唐麻将全集多功能辅助方法,大唐麻将全集果然真的有辅助方法在进入大唐麻将全集软件靠...
最新技巧透视挂插件!惜缘多功能... 最新技巧透视挂插件!惜缘多功能透视挂插件,惜缘本来有透视挂插件1、惜缘公共底牌简单,惜缘透视插件操作...
科普分享透视器插件!欢乐划水麻... 科普分享透视器插件!欢乐划水麻将多功能透视器插件,欢乐划水麻将一贯存在有透视器插件亲,关键说明,欢乐...
一分钟快速了解作弊器方法!天天... 一分钟快速了解作弊器方法!天天黄石麻将多功能作弊器方法,天天黄石麻将一直是有作弊器方法天天黄石麻将破...
总算清楚透视挂app!白金岛跑... 总算清楚透视挂app!白金岛跑得快多功能透视挂app,白金岛跑得快原来是有透视挂app;一、白金岛跑...
程序员教你作弊器插件!亲邻麻将... 程序员教你作弊器插件!亲邻麻将多功能作弊器插件,亲邻麻将总是有作弊器插件1、亲邻麻将破解器简单,亲邻...
玩家攻略开挂app!胡乐竞技多... 玩家攻略开挂app!胡乐竞技多功能开挂app,胡乐竞技本来是真的有开挂app1)胡乐竞技有没有挂:进...
六分钟了解外挂技巧!天天大冶麻... 六分钟了解外挂技巧!天天大冶麻将多功能外挂技巧,天天大冶麻将果然真的是有外挂技巧1、玩家可以在天天大...