La propiedad `history` está marcada como requerida en` Router`, pero su valor es ʻundefined`. en el enrutador

97

Soy nuevo en ReactJs. Este es mi codigo:

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'));

y compilarlo con webpack. También agregué el componente principal a mis alias. La consola arroja estos errores: también leo estos enlaces:

React Router falló el prop 'historial', no está definido

¿Cómo resuelvo que el historial está marcado como obligatorio, cuando el valor no está definido?

Actualizar React-Router y reemplazar hashHistory con browserHistory

y muchas búsquedas en la web, pero no pude solucionar este problema. React Router es la versión 4

Mammad2c
fuente

Respuestas:

172

Si está utilizando react-router v4, también debe instalar react-router-dom. Después de eso, importe BrowserRouter desde react-router-dom y cambie Router por BrowserRouter. Parece que la v4 cambia varias cosas. Además, la documentación de react-router está desactualizada. Este es mi código de trabajo:

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')
);

Fuente

betomoretti
fuente
11
En la versión 4, cuando utiliza 'react-router-dom', no es necesario importar 'react-router'. 'react-router-dom' está completo.
Mammad2c
4
Si tengo varias etiquetas <Route ...> dentro de BrowserRouter, obtengo este error: "Error no detectado: un <Router> puede tener solo un elemento secundario". ¿Como arreglar?
olefrank
1
@erp react-router-dom tiene más opciones que react-router. podrías visitar el documento. Pero solo has usado uno de ellos.
Mammad2c
2
@NSCoder no, el enrutador también está en 'react-router-dom', por lo que no es necesario incluir 'react-router-dom' y 'react-router'. Si necesita 'HashRouter' y 'router' juntos, debe incluir 'react-router-dom'.
Mammad2c
1
@olefrank, debe envolver sus múltiples <Route...>declaraciones en un <switch>contenedor en lugar de envolverlas <div>. Si usa <div>, esto hace que las rutas sean inclusivas, lo que significa que si una ruta puede coincidir con dos rutas, ambos componentes se renderizarán. Vea todos los detalles aquí: medium.com/@djoepramono/react-router-4-gotchas-2ecd1282de65
Muhammad Hannan
17

¿Qué versión de React Router estás usando? La versión 4 del enrutador cambió de pasar la clase browserHistory a pasar una instancia de browserHistory, vea el ejemplo de código en los nuevos documentos .

Esto ha atrapado a muchas personas que se actualizan automáticamente; un documento de migración saldrá "en cualquier momento".

Quieres agregar esto a la parte superior:

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

y

<Router history={newHistory}/>
Charles Merriam
fuente
versión 4. ¿Podrían convertir mi código a la versión 4, por favor?
Mammad2c
donde se customHistorydefine?
SharpCoder
lo siento. ¿mejor ahora?
Charles Merriam
4

Si desea tener varias rutas , puede usar un interruptor como este,

import {Switch} from 'react-router'; 

entonces

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

Tuve el mismo problema en ES6, pero cuando cambié para usar la biblioteca 'react-router-dom', el problema se resolvió. Para todos los fanáticos de ES6, aquí vamos:

npm install --save react-router-dom

En index.js:

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

ReactDOM.render(
    <HashRouter>
        <Route path="/" component={App}/>
    </HashRouter>
  ,
  document.getElementById('root')
);
Dimang Chou
fuente
In index.js:o In index.jsx:?
Raz Galstyan
@RazGalstyan index.js si está utilizando webpack.
Teoman shipahi
1

La versión 4 de React Router cambió varias cosas. Hicieron elementos de enrutador de nivel superior separados para los diferentes tipos de historia. Si está utilizando la versión 4, debería poder reemplazarla <Router history={hashHistory}>con <HashRouter>o <BrowserRouter>.
Para obtener más detalles, consulte https://reacttraining.com/react-router/web/guides

jack.lin
fuente
0

También escribo una práctica de inicio de sesión. Y también cumplir con la misma pregunta que tú. Después de un día de lucha, descubrí que solo this.props.history.push('/list/')puedo lograrlo en lugar de incorporar muchos complementos. Por cierto, la react-router-domversión es ^4.2.2. ¡Gracias!

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);
        }
    })
}

YangFang
fuente
0

Lo siguiente me funciona con "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')
)
Pritam Manerao
fuente