10

I am trying to pass a value from the render function to the component:

= react_component('App', props: {test: 'abc'}, prerender: false)

Routes.jsx

<Route path="/" component={App} >

App.jsx (component)

class App extends React.Component {
  render() {
    return (
      <Header test={this.props.test}>
      </Header>
      {this.props.children}
      <Footer />
    );
  }
}

App.propTypes = { test: PropTypes.string };

There does not seem to be a coherent answer to this complete flow.

I have tried the following:

<Route path="/" component={() => (<App myProp="value" />)}/>

But this still does not answer the question of picking up the value provided by the initial render call(react_component)

6
  • Use render instead Commented Nov 14, 2017 at 22:12
  • Which version of React Router are you using? Commented Nov 14, 2017 at 22:18
  • @Dez I am using react-router 3.0.5 Commented Nov 15, 2017 at 0:59
  • @SterlingArcher could you provide an end to end answer using render? That would greatly help Commented Nov 15, 2017 at 0:59
  • @AlexJose sure, here's an example of how I use it with props github.com/RUJodan/Source-React/blob/master/src/index.jsx Commented Nov 15, 2017 at 15:12

3 Answers 3

1

Looking for an end to end answer on how to pass a parameter from the "view" to the "react router" to the "component"

We will start from the view:

<%= react_component('MyRoute', {test: 123}, prerender: false) %>

Now we will create a component that holds our route:

class MyRoute extends Component{
  constructor(props){
    super(props)
  }
  render(){
    return(
      <Switch>
        <Route path="/" render={() => <App test={this.props.test} />} />
        <Route path="/login" component={Login} />
      </Switch>
    )
  }
}

As you can see, we passed the test prop from the Route component to the App component. Now we can use the test prop in the App component:

class App extends Component{
  constructor(props){
    super(props)
  }
  render(){
    return(
      <h1>{this.props.test}</h1>
    )
  }
}
Sign up to request clarification or add additional context in comments.

2 Comments

This seems to throw an error at the first step itself, while calling the component from the view. ArgumentError(wrong number of arguments (given 3, expected 1..2)
try removing prerender: false
1
<Route path="/" render={attr => <App {...attr} test="abc" />} />

Comments

1

In Router v3 you would do something like this

Wrap your App component under withRouter like this

import { withRouter } from 'react-router';

class App extends React.Component {
  render() {
    return (
      <Header test={this.props.test}>
      </Header>
      {
        this.props.children &&
        React.clone(this.props.children, {...this.props} )}
      <Footer />
    );
  }
}
App.propTypes = { test: PropTypes.string };
export const APP = withRouter(App);

And construct your routes like this...

<Route path="/" component={APP}>
  <Route path="/lobby" component={Lobby} />
  <Route path="/map" component={GameMap} />
  ...
</Route>

So your child routes will be rendered inside the APP children property an the props will be passed down to them.

Hope this helps!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.