我正在使用 ngrx 开发Ionic2应用程序。
要从我的商店中选择数据,我使用reselect。
我有一些页面使用相同的数据(来自同一个reducer),但结合其他reducer数据,取决于当前页面(这意味着每个页面都有自己的重选器,但每个选择器都有至少有一个与其他重新选择者有共同点的论点。所以每当其中一个参数改变时,这些页面的所有重选者都需要重新计算。)
它看起来像这样:
page1 = createSelector(fromState1.getData, fromCommonState.getData,(data, commonData) => {...});
page2 = createSelector(fromState2.getData, fromCommonState.getData,(data, commonData) => {...});
page3 = createSelector(fromState3.getData, fromCommonState.getData,(data, commonData) => {...});
我担心的是,如果公共状态发生变化时有很多页面,则重新计算所有选择器,即使我只需要重新计算当前页面使用的那个。我认为如果选择者需要做复杂的事情,这可能会成为一个重大的性能问题。
有没有办法暂停"从商店获取更新,直到我回到该页面?这样只会重新计算当前页面的选择器。
还是有另一种方法可以避免不必要的计算吗?
答案 0 :(得分:0)
当我们在整个应用(或多个智能组件)中使用选择器时,我会在公共文件(selectors.ts)中创建选择器。对于您的情况,为什么不简单地将选择器放在智能组件(页面)中?这样,它只在需要时计算和订阅。
reselect
与未使用Observables的库大量使用,实际上每次状态更改都会推送数据。对于像ngrx这样的库,除非你处理大量数据,否则这个增益可以忽略不计。对我来说,这是一个不成熟的优化。
要暂停状态,您可以在商店中的某个位置维护当前页面状态,然后使用过滤器仅在状态中的页面匹配时执行繁重操作。
let page3 = createSelector(
fromState3.getData, fromCommonState.getData,
(data, commonData) => {
if(fromState3.selected) {
// Large computation
}
});