[英]How to nest Reselect selectors?
我有一個返回數組的選擇器。 數組中的元素本身具有派生數據。 我基本上需要一個遞歸memoization選擇器,它返回一個由派生元素組成的派生數組。
我目前的嘗試是:
export const selectEntitesWithAssetBuffers = createSelector(
[selectSceneEntities, getAssets],
(entities, loadedAssets) => {
return entities.map((entity) => {
entity.buffers = entity.assets.map((assetName) => {
return loadedAssets[assetName].arrayBuffer;
})
return entity;
})
}
)
我在這里關注的是隨時entities
或者loadedAssets
變化,這將重新計算整個列表。 我期望設置的是像selectEntityWithBuffer
那樣傳遞給entities.map
。 理想情況下,我希望這只在entity.assets
數組更改時重新計算。
Reselect允許您為選擇器提供自定義相等定義。
import { defaultMemoize, createSelectorCreator } from 'reselect'
const compareByAssets = (a, b) => {
return a.every((element, index) => {
return element.assets === b[index].assets
});
};
const createAssetsComparatorSelector = createSelectorCreator(
defaultMemoize,
compareByAssets
);
const selectSceneEntitiesByAssetsComparator = createAssetsComparatorSelector((state) => {
//however you normally get entities for the pre-existing selectors
});
現在,您可以使用這個新的selectSceneEntitiesByAssetsComparator
代替您提供的上述代碼中的先前selectSceneEntities
,它只會在compareByAssets
的相等性檢查失敗時重新運行。
如果嚴格比較assets === assets
不能滿足您的需求,請隨意進一步更新比較器功能。
作為概念證明,我嘗試通過繞過重新選擇身份檢查來將loadedAssets
對象提供給結果函數。
// Keep a private selector instance
let cachedSelector;
export const selectEntitesWithAssetBuffers = function(){
// loadedAssets should be recalculated on each call?
const loadedAssets = getAssets(arguments);
// create selector on first call
if(cachedSelector === undefined) {
cachedSelector = createSelector(
selectSceneEntities,
entities => {
return entities.map(entity => {
entity.buffers = entity.assets.map((assetName) => {
return loadedAssets[assetName].arrayBuffer;
})
return entity;
})
}
)
}
// Return selector result
return cachedSelector(arguments);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.