NGRX嵌套Feature时自动生成Selector失效问题求助
NGRX嵌套Feature选择器问题解决方法
一、无需手动重定义所有选择器的方案
自动生成的选择器默认从根State的对应Feature节点取值,当Feature嵌套在子State下时,只需重新指定该Feature的根选择器路径即可:
- 先创建
substate1的根选择器:
// 推荐用createFeature创建substate1,自动生成根选择器 export const substate1Feature = createFeature({ name: 'substate1', reducer: combineReducers({ feature1: feature1.reducer, feature2: feature2.reducer, }), }); export const selectSubstate1 = substate1Feature.selectSubstate1;
- 重写
feature1的selectFeatureState(自动生成选择器的基础):
// 让feature1的根选择器指向substate1下的feature1节点 feature1.selectFeatureState = createSelector( selectSubstate1, (state) => state.feature1 );
完成后,原来自动生成的feature1.selectA、feature1.selectB就能正常从嵌套路径取值,无需逐个重定义。
二、手动组合选择器的方案(若上述方法不适用)
如果需要单独编写目标选择器,可以复用自动生成的feature1.selectA,步骤如下:
- 先创建
substate1的根选择器(同上述步骤1):
export const substate1Feature = createFeature({ name: 'substate1', reducer: combineReducers({ feature1: feature1.reducer, feature2: feature2.reducer, }), }); export const selectSubstate1 = substate1Feature.selectSubstate1;
- 编写组合选择器,复用自动生成的选择器:
export const selectFeature1A = createSelector( // 先获取substate1下的feature1节点 createSelector(selectSubstate1, (state) => state.feature1), // 直接复用feature1自动生成的selectA feature1.selectA );
或者更简洁的写法:
export const selectFeature1A = createSelector( selectSubstate1, (substate1) => feature1.selectA(substate1.feature1) );
内容的提问来源于stack exchange,提问作者mariusr
相关产品推荐
相关产品推荐

