kev*_*ler 9 javascript reactjs redux reselect
我有一个返回数组的选择器.数组中的元素本身具有派生数据.我基本上需要一个递归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;
})
}
)
Run Code Online (Sandbox Code Playgroud)
我在这里的担忧是随时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
});
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用此新代码selectSceneEntitiesByAssetsComparator替换selectSceneEntities上面提供的代码中的上一个代码,并且只有在相等检入compareByAssets失败时才会重新运行.
如果严格比较assets === assets不符合您的需求,请随意更新比较器功能.
| 归档时间: |
|
| 查看次数: |
779 次 |
| 最近记录: |