Search code examples
reactjsreact-routerreact-router-v4html5-history

React Router: Query Param Match?


According to the accepted answer to this question, React Router 4 doesn't match query parameters anymore. If I go from a URL matched by one of my <Route>s to the same URL with a different query string, the content doesn't seem to change. I believe this is because navigating between URLs that match the same <Route> doesn't change the content, but please correct me if I'm wrong. Given this, how do I use React Router for a set of URL's that need to differ only by query parameter?

For example, many search engines and other sites that use search bars, including the site I am working on, use a query parameter, commonly q or query. The user may search for one thing, then decide that is not what he/she wants and search for another thing. The user may type in the second URL or search with the search bar again. There isn't really a place for the search term in the URL path, so it kind of needs to go in the query string. How do we handle this situation?

Is there a way, with React Router, to link to a URL that only differs in the query string and change the content, without refreshing the entire page? Preferably, this wouldn't require any external library besides React and React Router.


Solution

  • Try the render function prop instead of component prop of Route. Something like this:

    <Route render={props => {
      // look for some param in the query string...
      const useComponentA = queryStringContains('A');
      if(useComponentA) {
        return <ComponentA {...props}/>;
      } else {
        return <ComponentB {...props}/>;
      }
    }}/>