Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React Router: access history in rendered Route component

I know there are quite a few questions on this, but I cannot seem to get it to work: I need to access "history" from the child components that are rendered through the Routes. (It receives props from a redux container).

I need to pass down the history object to the components that are rendered in each Route, so that I can this.props.history.push('/route') in the child components. This application was less dynamic before, so each Route was hardcoded with a component={someComponent}; but I found that in doing the Routes dynamically, you need to use render={() => <someComponent />}.

After changing the Routes from component={} to render={() => ...} I lost history in the child components.

My code is something like:

import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import { HashRouter as Router, Link, Route, Redirect } from 'react-router-dom';

import { Nav_Item } from '.'
import DynamicTab from '.';

export default class NavBar extends React.Component {
  constructor(props) {
    super(props);
    this.state={}
  }
  render() {

    let tabs = [];

    let routes = [];

    this.props.tabs.forEach( function(tab, index) {
      tabs.push(<Nav_Item  key={tab.name} path_name={'/' + tab.name} tab_text={tab.label} />);
      routes.push(<Route key={tab.name} path={'/' + tab.name} render={() => <DynamicTab tabName={tab.name} tabSpecs={tab} />} />);
    })

    return (
      <Router>
        <div>

          <div>
            <ol>
              { tabs }    
            </ol>
          </div>

          <Redirect to={'/' + this.props.tabs[0].name} />
          { routes } 

        </div>
      </Router>   
    )
  }
}
like image 846
jaimefps Avatar asked Sep 12 '17 19:09

jaimefps


1 Answers

When you use render you actually get props. In the docs they have an example like this:

<Route {...rest} render={props => (
   <FadeIn>
       <Component {...props}/>
   </FadeIn>
 )}/>

So you should be able to access history from those props.

Another solution would be to conditionally render a <Redirect/> component. So maybe you have some internal state that you use like this:

// in your components render function.. 
if(this.state.shouldRedirect) { 
  return (<Redirect to={yourURL} />);
}
like image 52
jonahe Avatar answered Oct 21 '22 13:10

jonahe