2016-10-05 11 views
14

Ich bin neu zu reagieren-Router und ich habe gerade angefangen, eine Anwendung mit react-Router V4 zu schreiben. Ich würde gerne Requisiten an Komponenten weitergeben, die von <Match /> gerendert wurden, und ich frage mich, was der "beste" oder "richtige" Weg ist, dies zu tun.Requisiten an Komponente in React Router 4 übergeben

Ist es so etwas zu tun?

<Match pattern="/" render={ 
    (defaultProps) => <MyComponent myProp = {myProp} {...defaultProps} /> 
}/> 

Ist das (Requisiten Komponenten vorbei <Match /> gerendert werden) auch eine gute Praxis zu tun mit reagieren-Router oder ist es ein Antipattern oder etwas; und wenn ja, warum?

+0

sieht gut für mich. –

Antwort

0

Ich mache es wie folgt, um die Klarheit zu verbessern.

const myComponent = <MyComponent myProp={myProp} {...defaultProps} /> 


<Match pattern="/" component={myComponent} /> 

Durch diese Ihre router Code wird nicht durcheinander bekommen !.

+0

Ist das gültig? Die [Dokumentation] (https://reac-router.now.sh/Match) sagt, dass 'render' eine Funktion übernimmt, während Sie in Ihrem Beispiel eine Komponenteninstanz übergeben. –

+0

Mein Fehler! Die Antwort wurde aktualisiert! –

+0

Hmm, tut mir leid nochmal zu fragen, aber ist das noch gültig? Gemäß der Dokumentation nimmt 'component' eine Komponente * constructor *, während Sie eine Komponenteninstanz liefern –

0

Ich benutze render in Kombination mit einem definierten Verfahren wie folgt:

class App extends React.Component { 
    childRoute (ChildComponent, match) { 
    return <ChildComponent {...this.props} {...match} /> 
    } 

    render() { 
    <Match pattern='/' render={this.childRoute.bind(this, MyComponent)} /> 
    } 
} 
+0

Sie binden die Komponente alle Mal wird der Render aufgerufen. – Qwerty

0

Die render prop ist für das Schreiben von Inline-Matches gemeint, so dass Ihr Beispiel ist der ideale Weg, um zusätzliche Requisiten passieren.

+0

Ist es besser in diesem Fall 'component' anstelle von' render' zu verwenden? – Qwerty

+0

@Qwerty Ich habe gerade meine Antwort bearbeitet, um diesen Kommentar zu entfernen. Wenn Sie eine Inline-Funktion verwenden, sollten Sie auch 'render' verwenden. Dies mit 'component' zu tun ist wirklich ineffizient (Sie werden bei jedem Rendervorgang eine neue Komponente unmounten/mounten). –

5
render() { 
    return(
     <Router history={browserHistory}> 
     <div> 
      <Route path="/" render={() => <Header 
      title={"I am Title"} 
      status={"Here is my status"} 
      /> 
      }/> 
       <Route path="/audience" component={Audience}/> 
       <Route path="/speaker" component={Speaker}/> 
     </div> 
     </Router> 
    ); 
} 
+0

Könnte für Ihr q nicht relevant sein? aber in reait Router 4 ist es möglich, es bis zu tun. – Jsun

+1

Es sieht so aus, als ob Ihr Kommentar Teil Ihrer Antwort sein sollte. – flaviodesousa

+0

Yup, In Reagieren Router v4 viele Änderungen, würden Sie nicht außer es wird Arbeit sein wie zuvor verwendet werden. – Jsun

2

müssen Sie verwenden die render prop statt component auf benutzerdefinierten Requisiten passieren, sonst nur default Route props weitergegeben werden ({match, location, history}).

Ich gebe meine Requisiten an den Router und Kind-Komponenten wie so.

class App extends Component { 

    render() { 
    const {another} = this.props 
    return <Routes myVariable={2} myBool another={another}/> 
    } 
} 

const Routes = (props) => 
    <Switch> 
    <Route path="/public" render={ (routeProps) => 
     <Public routeProps={routeProps} {...props}/> 
    }/> 
    <Route path="/login" component={Login}/> 
    <PrivateRoute path="/" render={ (routeProps) => 
     ... 
    }/> 
    </Switch> 
0

Ich bin ziemlich neu zu reagieren-Router und stieß auf ein ähnliches Problem. Ich habe einen Wrapper basierend auf der Documentation erstellt und das scheint zu funktionieren.

// Wrap Component Routes 
function RouteWrapper(props) { 
    const {component: Component, ...opts } = props 

    return (
    <Route {...opts} render={props => (
    <Component {...props} {...opts}/> 
    )}/> 
) 
} 

<RouteWrapper path='/' exact loggedIn anotherValue='blah' component={MyComponent} /> 

So weit so gut

Verwandte Themen