【发布时间】:2019-01-07 00:42:31
【问题描述】:
我有一个高阶组件,它使用 React Router 提供的 location.search 属性来构造一个 queryParams 对象并将其作为属性传递给它的包装组件。
function withQueryParams(WrappedComponent) {
return (props) => {
const queryParams = myUtils.parseParams(props.location.search); // props.location provided by React Router
const newProps = {
...props,
queryParams: queryParams
}
return <WrappedComponent {...newProps} />
}
}
export default withQueryParams
我会这样使用它:
class MyComponent extends React.Component { ... }
export default withQueryParams(MyComponent)
当然,我会将MyComponent 包裹在一条路线中:
<Route path="/mycomponent" component={MyComponent} />
但回到我的withQueryParams HOC,我想确保props.location 始终可用,这意味着我希望它始终拥有来自 React Router 的道具。输入withRouter,它本身就是一个由 React Router 提供的 HOC,你可以使用它来使这些 props 可用。
在我的withQueryParams HOC 中使用withRouter 以确保props.location 可用的最佳方式是什么?
谢谢。
【问题讨论】:
-
根据
组件的文档 (reacttraining.com/react-router/web/api/Route/component),任何由 组件渲染的组件都会传递三个 props:match、location、history。这些是备受追捧的道具,我相信当相关组件不是由 组件直接呈现的组件时,使用 withRouter 提供这些道具。 -
是的,没错。这里的目标是让
withQueryParams不具有对 React Router 道具的这种隐式依赖。当它用于不是由<Route>呈现的组件时,它不应该中断。这就是为什么我想将它包装在withRouter中,这样它总是有可用的道具,即使它不在实际的<Route>的上下文中。
标签: javascript reactjs react-router react-redux