RTK Query结合createSelector使用时无法获取完整state的解决方案咨询
RTK Query结合createSelector使用时无法获取完整state的解决方案咨询
嘿,我看你遇到了在createSelector里用RTK Query的select方法时拿不到完整state的问题,这个其实是createSelector的设计导致的——它的转换函数只能拿到前面输入选择器返回的结果,没法直接访问整个state。给你几个实用的解决方案:
方案一:把整个state作为输入选择器传入
最简单的办法就是在你的输入选择器数组里多加一个返回整个state的选择器,这样转换函数就能拿到state参数了:
export const selectXX = createSelector( [ (state: IRootState) => state.xx.A, (state: IRootState) => state.xx.B, (state: IRootState) => state, // 新增:传入整个state ], (A, B, state): IViewerSpace[] => { if (A == null || B == null) { return []; } const args = { A, B }; const resp = designRTK.endpoints.getData.select(args); const abc = resp(state).data; // 这里写你的转换逻辑 // ... return transformedResult; } );
不过要注意,因为Redux的state是immutable的,每次状态更新都会生成新的state对象,所以只要全局state有任何变化,这个选择器都会重新计算。如果你的转换逻辑比较重,可能会有性能小问题,但大部分场景下这个方案足够用了。
方案二:在输入选择器中提前获取RTK Query数据
如果想优化性能,避免不必要的重新计算,可以把RTK Query的select调用放到输入选择器里,这样只有当A或B变化时,才会去获取对应的缓存数据:
export const selectXX = createSelector( [ (state: IRootState) => state.xx.A, (state: IRootState) => state.xx.B, // 直接在输入选择器里处理RTK Query的查询 (state: IRootState) => { const A = state.xx.A; const B = state.xx.B; if (!A || !B) return null; const args = { A, B }; return designRTK.endpoints.getData.select(args)(state).data; } ], (A, B, abc): IViewerSpace[] => { if (A == null || B == null || !abc) { return []; } // 你的转换逻辑 // ... return transformedResult; } );
这个方案里,第三个输入选择器的依赖是A和B,只有当A/B变化时,才会重新执行RTK Query的select逻辑,选择器的缓存命中率更高,性能更好。
额外小提示
你原来的代码里第一个输入选择器后面少了个逗号,(state: IRootState) => state.xx.A后面要加个逗号,不然会触发语法错误哦~
备注:内容来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

