问题
I have a higher order component which uses the location.search prop provided by React Router to construct a queryParams object and pass it as a prop to its wrapped component.
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
And I'd use it like this:
class MyComponent extends React.Component { ... }
export default withQueryParams(MyComponent)
And of course I'd wrap MyComponent in a route:
<Route path="/mycomponent" component={MyComponent} />
But going back to my withQueryParams HOC, I'd like to ensure that props.location is always available, meaning I'd like it always to have props from React Router. Enter withRouter, which is itself a HOC provided by React Router that you can use to make those props available.
What would be the best way to use withRouter inside my withQueryParams HOC to ensure that props.location is available?
Thanks.
回答1:
function withQueryParams(WrappedComponent) {
return withRouter((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
回答2:
You can wrap your component with both the HOCs namely withRouter and withQueryParams. You can use recompose to wrap your components with these HOCs. I've created a sandbox for this. https://codesandbox.io/s/y493w29lz
First, Hit the https://y493w29lz.codesandbox.io/main. This will display following output on the screen.
MainComponent
SubComponent
"No Query Params available"
Now, Try passing a query parameter e.g. https://y493w29lz.codesandbox.io/main?query=hello. You can see that the query parameters are printed on the screen.
MainComponent
SubComponent
Query Params = {"query":"hello"}
Here, The component SubComponent is not rendered by the Route but it is receiving the query parameters as we have wrapped this component using the withRouter and withQueryParms HOCs.
export const SubComponent = compose(
withRouter,
withQueryParams
)(SubComponentView);
Now, If you render the SubComponent only by hitting the URL https://y493w29lz.codesandbox.io/sub?query=hello. It will display the following output.
SubComponent
Query Params = {"query":"hello"}
Hope this answers your question. :)
来源:https://stackoverflow.com/questions/51599479/how-can-i-use-react-routers-withrouter-hoc-inside-my-own-higher-order-component