Właściwość „history” jest oznaczona jako wymagana w „Router”, ale jej wartość to „undefined”. w routerze


97

Jestem nowy w ReactJs. To jest mój kod:

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

i kompilowanie go za pomocą pakietu internetowego. Dodałem również komponent Main do moich aliasów. Konsola wyrzuca te błędy: czytam też te linki:

React Router failed prop 'history', jest niezdefiniowane

Jak rozstrzygnąć, czy historia jest oznaczona jako wymagana, gdy wartość jest niezdefiniowana?

Uaktualnienie React-Router i zamiana hashHistory na browserHistory

i wiele wyszukiwań w internecie, ale nie udało mi się rozwiązać tego problemu. React Router to wersja 4

Odpowiedzi:


172

Jeśli korzystasz z React-router v4, musisz również zainstalować React-router-dom. Następnie zaimportuj BrowserRouter z pliku React-router-dom i zmień router na BrowserRouter. Wygląda na to, że v4 zmienia kilka rzeczy. Ponadto dokumentacja React-router jest nieaktualna. To jest mój działający kod:

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

Źródło


11
W wersji 4, gdy używasz „React-router-dom”, nie ma potrzeby importowania „React-router”. „Reaguj-router-dom” jest zakończona.
Mammad2c

4
Jeśli mam wiele tagów <Route ...> wewnątrz BrowserRouter, pojawia się następujący błąd: „Uncaught Error: A <Router> może mieć tylko jeden element podrzędny”. Jak naprawić?
olefrank

1
@erp respond-router-dom ma więcej opcji niż respond-router. możesz odwiedzić dokument. Ale używasz tylko jednego z nich.
Mammad2c

2
@NSCoder nie, router również znajduje się w polu „React-router-dom”, więc nie ma potrzeby umieszczania zarówno opcji „React-router-dom”, jak i „Reaguj-router”. Jeśli potrzebujesz razem „HashRouter” i „routera”, musisz uwzględnić „reak-router-dom ”.
Mammad2c

1
@olefrank, zamiast zawijać je , musisz opakować swoje <Route...>instrukcje w <switch>opakowanie <div>. Jeśli używasz <div>, powoduje to, że trasy są włączone, co oznacza, że ​​jeśli ścieżka może pasować do dwóch tras, oba komponenty będą renderowane. Zobacz pełne szczegóły tutaj: medium.com/@djoepramono/react-router-4-gotchas-2ecd1282de65
Muhammad Hannan

17

Której wersji React Router używasz? Wersja routera 4 została zmieniona z przekazywania w klasie browserHistory na przekazywanie instancji browserHistory, zobacz przykład kodu w nowej dokumentacji .

To przyciąga wielu ludzi, którzy automatycznie aktualizują; dokument migracji zostanie opublikowany „lada dzień”.

Chcesz dodać to na górze:

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

i

<Router history={newHistory}/>

wersja 4. Czy mógłbyś przekonwertować mój kod do wersji 4?
Mammad2c

gdzie jest customHistoryzdefiniowane?
SharpCoder

Przepraszam. Lepiej teraz?
Charles Merriam

4

Jeśli chcesz mieć wiele tras , możesz użyć takiego przełącznika,

import {Switch} from 'react-router'; 

następnie

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

3

Mam ten sam problem w ES6, ale kiedy przełączyłem się na bibliotekę „React-router-dom”, problem został rozwiązany. Dla wszystkich fanów ES6, zaczynamy:

npm install --save react-router-dom

W 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:czy In index.jsx:?
Raz Galstyan,

@RazGalstyan index.js, jeśli używasz webpacka.
Teoman shipahi

1

Wersja 4 React Router zmieniła kilka rzeczy. Stworzyli oddzielne elementy routera najwyższego poziomu dla różnych typów historii. Jeśli używasz wersji 4 powinna być w stanie wymienić <Router history={hashHistory}>z <HashRouter>lub <BrowserRouter>.
Więcej szczegółów można znaleźć pod adresem https://reacttraining.com/react-router/web/guides


0

Piszę również praktykę logowania. A także spotykam się z tym samym pytaniem, co Ty. Po całodziennej walce stwierdziłem, że tylko this.props.history.push('/list/')może to zrobić, zamiast ciągnąć wiele wtyczek. Nawiasem mówiąc, react-router-domwersja jest ^4.2.2. Dzięki!

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

Poniższe działa w przypadku mnie z adresem „act-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')
)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.