如何嵌套重选选择器?

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)

我在这里的担忧是随时entitiesloadedAssets改变这将重新计算整个列表.我期待设置的东西就像是一个selectEntityWithBuffer传递给它的东西entities.map.理想情况下,我希望这只在entity.assets数组更改时重新计算.

Jak*_*oby 6

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不符合您的需求,请随意更新比较器功能.