2017-07-17 5 views
0

Nach der Aktualisierung von React Router V2.x auf V4.x gehen alle Routen auf die Hauptseite.Umstellung von React Router V2.x auf V4.x

Hier ist die Route auf V2.x:

import {Router, Route, hashHistory } from 'react-router' 

const routes = <Route component={App}> 
    <Route path="/results" component={Results} /> 
    <Route path="/" component={Voting} /> 
</Route>; 

ReactDOM.render(
    <Router history={hashHistory}>{routes}</Router>, 
    document.getElementById('app') 
); 

Und das sind Strecken, auf V4.x:

index.jsx Datei:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom' 
import App from './components/App'; 
import Voting from './components/Voting'; 
import Results from './components/Results'; 

const withAppLayout = Component => props => <App><Component {...props} /></App> 

const routes = <Switch> 
    <Route exact path="/" component={withAppLayout(Voting)} /> 
    <Route path="/results" component={withAppLayout(Results)} /> 
</Switch>; 

ReactDOM.render(
     <Router component={App}> 
      {routes} 
     </Router>, 
     document.getElementById('app') 
     ); 

App.jsx Datei:

import React from 'react'; 
import {List} from 'immutable'; 

const pair = List.of('Trainspotting', '28 Days Later'); 

export default React.createClass({ 
    render: function() { 
     console.log(this.props.children); 
     return React.cloneElement(this.props.children, {pair: pair}); 
    } 
}); 

Voting.jsx Datei:

import React from 'react'; 
import PureRenderMixin from 'react-addons-pure-render-mixin'; 
import Winner from './Winner'; 
import Vote from './Vote'; 

export default React.createClass({ 
    mixins: [PureRenderMixin], 
    render: function() { 
     return <div> 
      {this.props.winner ? 
          <Winner ref="winner" winner={this.props.winner} /> : 
          <Vote {...this.props} /> 
      } 
     </div>; 
    } 
}); 

Results.jsx Datei:

import React from 'react'; 
import PureRenderMixin from 'react-addons-pure-render-mixin'; 

export default React.createClass({ 
    mixins: [PureRenderMixin], 
    render: function() { 
     return <div>Hello from results!</div> 
    } 
}); 

Wie um diesen Fehler zu beheben?

Antwort

1

Eine Sache wäre zu verwenden:

<Route exact path="/" component={withAppLayout(Voting)} /> 

Die genaue wird sicherstellen, dass nur der genaue Pfad übereinstimmen wird. Aber wenn Sie den Pfad = "/" nach den anderen haben, sollten die anderen jedoch zuerst übereinstimmen. Ist das der echte Code, den Sie verwenden?

Bearbeiten: Siehe eine vollständige Version unten.

import {BrowserRouter, Route, Switch} from 'react-router-dom' 

ReactDOM.render(
    <BrowserRouter> 
     <Switch> 
      <Route exact path="/" component={Voting} /> 
      <Route path="/results" component={Results} /> 
     </Switch> 
    </BrowserRouter>, 
    document.getElementById('app') 
); 

Dann, wenn das klappt, können Sie den Switch-Teil in eine App-Komponente verschieben. Wenn Sie den Hash-Verlauf verwenden möchten, müssen Sie einen HashRouter verwenden, der einen Router mit einem Hash-Verlauf initialisiert.

+0

Ja, das ist der Code, den ich benutze, genaues Hinzufügen funktioniert nicht, und der '/ results' Pfad geht auch auf die Hauptseite. –

+0

Da wir dabei sind, wird mit BrowserRouter die Geschichte, die Sie übergeben, sowieso nicht verwendet, und es sollte eine Warnung in Ihrer Konsole ausgeben. Ich würde es sowieso entfernen, da es nichts macht. Oder verwenden Sie den Router, da Sie damit einen benutzerdefinierten Verlauf angeben können. Auch wickle ich immer meine jsx mit Klammern, wenn es mehrzeilig ist, vielleicht versuchen Sie es nur für den Fall, wir wissen es nie! –

+0

Router hat auch keine Komponente prop, also entfernen Sie es einfach, das kann Ihr Problem tatsächlich verursachen, da die App-Komponente auch von Ihrem withAppLayout HOC zurückgegeben wird. –