簡體   English   中英

如何嵌套重選選擇器?

[英]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);
}

獲得比你所獲得的更深入的記憶是一個棘手的問題,因為Reselect並不真正支持將參數傳遞給選擇器。 如果您從選擇器返回一個數組,並且用於構建該數組的輸入已更改,那么它將是您需要重新計算的Reselect的預期行為。 請參閱自述文件中有關動態參數的建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM