如何在Redux的一个选择器中调用另一个选择器并传递状态?
解决Redux Selector中传递state的问题
你的核心问题是createSelector的回调里无法获取state——因为当前依赖数组只传入了selectSpecialEntityGuids,回调只能拿到这个选择器返回的guids。有两种直接的解决方式:
方法一:将state加入依赖数组
把state作为第一个依赖项传入createSelector的数组,这样回调函数就能拿到state,再传给selectItemByGuid:
export const selectSpecialItems = createSelector( [state => state, selectSpecialEntityGuids], (state, guids) => { const items = guids.map(guid => selectItemByGuid(state, guid)) // 过滤掉找不到的item(避免返回undefined),空数组兜底 return items.filter(Boolean) || [] }, )
方法二:重构selectItemByGuid为可组合的选择器
如果想更贴合reselect的组合风格,可以把selectItemByGuid改造成接受guid作为参数的工厂函数,返回一个选择器:
// 重构后的选择器工厂 const selectItemByGuid = (guid) => (state) => { return state.items.find(i => i.guid === guid) } // 使用时直接在map里生成对应选择器并传入state export const selectSpecialItems = createSelector( [state => state, selectSpecialEntityGuids], (state, guids) => { const items = guids.map(guid => selectItemByGuid(guid)(state)) return items.filter(Boolean) || [] }, )
注意点
- 建议用
filter(Boolean)过滤掉找不到的item,避免数组里出现undefined - 比较guid时推荐用严格相等
===,避免隐式类型转换问题
内容的提问来源于stack exchange,提问作者noblerare
相关产品推荐
相关产品推荐

