Redux中如何将ownProps参数传递给selector?
如何正确将ownProps传递给Reselect的Selector
我来帮你搞定这个Reselect传递ownProps的问题,你遇到的报错和返回类型问题,都是因为对Reselect的参数处理机制理解有偏差,下面给你两种靠谱的解决方案:
方案一:直接在Selector的输入选择器中接收ownProps
Reselect生成的selector函数本身支持接收额外参数(比如ownProps),这些参数会被传递给所有的输入选择器和最终的结果函数。你只需要在输入选择器里明确接收ownProps,并把需要的属性提取出来作为输入项即可:
// 正确的selector写法 export const nameSelector = createSelector( [ // 第一个输入选择器:获取state中的name state => state.element.get('name'), // 第二个输入选择器:接收ownProps并提取showMessage (state, ownProps) => ownProps.showMessage ], // 结果函数的参数对应输入选择器的返回值 (name, showMessage) => !name.trim() && showMessage ); // mapStateToProps中正常调用,传入state和ownProps const mapStateToProps = (state, ownProps) => ({ disabledAfterSave: nameSelector(state, ownProps) });
为什么你之前的写法报错?因为你直接在结果函数里写了ownProps,但没有任何输入选择器把ownProps传递进来,Reselect的结果函数参数只对应输入选择器的返回值,所以ownProps自然未定义。
方案二:使用工厂函数生成绑定ownProps的Selector
如果你希望把ownProps预先绑定到selector中,可以写一个工厂函数(返回selector的函数),但注意调用时需要分两步:先传入ownProps生成selector,再传入state执行它:
// 工厂函数:接收ownProps,返回对应的selector export const makeNameSelector = (ownProps) => createSelector( [state => state.element.get('name')], (name) => !name.trim() && ownProps.showMessage ); // mapStateToProps中先调用工厂函数生成selector,再传入state执行 const mapStateToProps = (state, ownProps) => ({ disabledAfterSave: makeNameSelector(ownProps)(state) });
你之前用这种方法时返回[Function selector],就是因为只调用了makeNameSelector(ownProps),这一步返回的是Reselect生成的selector函数,并没有执行它,所以需要再加上(state)来获取最终的布尔值结果。
两种方案都能解决你的问题,方案一更简洁直接,适合大多数场景;方案二更灵活,适合需要复用selector并绑定不同参数的场景。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

