Die Requisite "history" ist in "Router" als erforderlich markiert, ihr Wert ist jedoch "undefined". im Router


94

Ich bin neu bei ReactJs. Das ist mein Code:

var React = require('react');
var ReactDOM = require('react-dom');
var {Route, Router, IndexRoute, hashHistory} = require('react-router');
var Main = require('Main');
ReactDOM.render(
  <Router history={hashHistory}>
  <Route path="/" component={Main}></Route>
</Router>, document.getElementById('app'));

und kompilieren Sie es mit Webpack. Außerdem habe ich meinen Aliasnamen die Hauptkomponente hinzugefügt. Die Konsole gibt folgende Fehler aus: Ich habe auch diese Links gelesen:

React Router fehlgeschlagen Prop 'Verlauf', ist undefiniert

Wie löse ich, dass der Verlauf als erforderlich markiert ist, wenn der Wert nicht definiert ist?

Aktualisieren von React-Router und Ersetzen von hashHistory durch browserHistory

und viele Suchanfragen im Internet, aber ich konnte dieses Problem nicht beheben. React Router ist Version 4

Antworten:


169

Wenn Sie den React-Router v4 verwenden, müssen Sie auch den React-Router-Dom installieren. Importieren Sie anschließend BrowserRouter aus dem React-Router-Dom und wechseln Sie den Router für BrowserRouter. Es scheint, dass v4 mehrere Dinge ändert. Außerdem ist die Dokumentation zum React-Router veraltet. Dies ist mein Arbeitscode:

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route } from 'react-router-dom'
import App from './components/App';

ReactDOM.render((
     <BrowserRouter>
          <Route path="/" component={App}/>
     </BrowserRouter>
     ),
     document.getElementById('root')
);

Quelle


11
Wenn Sie in Version 4 'React-Router-Dom' verwenden, müssen Sie 'React-Router' nicht importieren. 'React-Router-Dom' ist abgeschlossen.
— Mammad2c

4
Wenn ich mehrere <Route ...> -Tags in BrowserRouter habe, wird folgende Fehlermeldung angezeigt: "Nicht erfasster Fehler: Ein <Router> hat möglicherweise nur ein untergeordnetes Element". Wie repariert man?
— Olefrank

1
@erp React-Router-Dom hat mehr Optionen als React-Router. Sie könnten das Dokument besuchen. Aber Sie haben nur einen von ihnen verwendet.
— Mammad2c

2
@NSCoder nein, der Router befindet sich ebenfalls im 'React-Router-Dom', sodass nicht sowohl 'React-Router-Dom' als auch 'React-Router' eingeschlossen werden müssen. Wenn Sie 'HashRouter' und 'Router' zusammen benötigen, müssen Sie 'React-Router-Dom' einschließen.
— Mammad2c

1
@olefrank Sie müssen Ihre mehreren <Route...>Anweisungen in einen <switch>Wrapper einbinden, anstatt sie einzuschließen <div>. Wenn Sie <div>diese Option verwenden, werden die Routen eingeschlossen. Wenn ein Pfad zwei Routen entsprechen kann, werden beide Komponenten gerendert. Alle
— Muhammad Hannan

17

Welche Version von React Router verwenden Sie? Router Version 4 wurde von der Übergabe der browserHistory-Klasse auf die Übergabe einer Instanz von browserHistory geändert. Weitere Informationen finden Sie im Codebeispiel in den neuen Dokumenten .

Dies hat viele Leute gefangen, die automatisch upgraden; Ein Migrationsdokument wird "jeden Tag" veröffentlicht.

Sie möchten dies oben hinzufügen:

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

und

<Router history={newHistory}/>

Version 4. Könnten Sie bitte meinen Code in Version 4 konvertieren?
— Mammad2c

wo ist customHistorydefiniert?
— SharpCoder

Es tut uns leid. besser jetzt?
— Charles Merriam

4

Wenn Sie mehrere Routen haben möchten, können Sie den Schalter wie folgt verwenden:

import {Switch} from 'react-router'; 

dann

<BrowserRouter>
     <Switch>
         <Route exact path="/" component={TodoComponent} />
         <Route path="/about" component={About} />
     </Switch>
</BrowserRouter>

3

Ich habe das gleiche Problem in ES6, aber als ich auf die Bibliothek 'react-router-dom' umgestiegen bin, wurde das Problem gelöst. Für alle Fans von ES6 geht es los:

npm install --save react-router-dom

In index.js:

import {HashRouter, Route} from 'react-router-dom';
import App from './App';

ReactDOM.render(
    <HashRouter>
        <Route path="/" component={App}/>
    </HashRouter>
  ,
  document.getElementById('root')
);

In index.js:oder In index.jsx:?
— Raz Galstyan

@RazGalstyan index.js, wenn Sie Webpack verwenden.
— Teoman Shipahi

1

Version 4 von React Router hat einige Dinge geändert. Sie erstellten separate Router-Elemente der obersten Ebene für die verschiedenen Verlaufstypen. Wenn Sie mit der Version 4 sollten Sie in der Lage sein , zu ersetzen , <Router history={hashHistory}>mit <HashRouter>oder <BrowserRouter>.
Weitere Informationen finden Sie unter https://reacttraining.com/react-router/web/guides


0

Ich schreibe auch eine Login-Praxis. Und auch die gleiche Frage wie Sie. Nach einem Tag Kampf fand ich, dass nur es schaffen this.props.history.push('/list/')kann, anstatt viele Plugins zu ziehen. Die react-router-domVersion ist übrigens ^4.2.2. Vielen Dank!

handleSubmit(e){
    e.preventDefault();
    this.props.form.validateFieldsAndScroll((err,values)=>{
        if(!err){
            this.setState({
                visible:false
            });
            this.props.form.resetFields();
            console.log(values.username);
            const path = '/list/';
            this.props.history.push(path);
        }
    })
}


0

Das Folgende funktioniert bei mir mit "react-router@^3.0.5":

package.json:

"react-dom": "^16.6.0",
"react-router": "^3.0.5"

index.js:

import { render } from 'react-dom'
import { App } from './components/App'
import { NotFound404 } from './components/NotFound404'
import { Router, Route, hashHistory } from 'react-router'

render(
    <Router history={hashHistory}>
        <Route path='/' component={App} />
        <Route path='*' component={NotFound404} />
    </Router>,
    document.getElementById('root')
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.