Опора `history` помечена как обязательная в` Router`, но ее значение не определено. в роутере


97

Я новичок в ReactJs. Это мой код:

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

и компилируем его с помощью webpack. Также я добавил к своим псевдонимам компонент Main. Консоль выдает эти ошибки: я также читал эти ссылки:

React Router failed prop 'history' не определено

Как решить, что история помечена как обязательная, если значение не определено?

Обновление React-Router и замена hashHistory на browserHistory

и множество поисковых запросов в Интернете, но я не смог исправить эту проблему. React Router - это версия 4

Ответы:


172

Если вы используете response-router v4, вам также необходимо установить response-router-dom. После этого импортируйте BrowserRouter из response-router-dom и переключите Router на BrowserRouter. Похоже, что v4 меняет несколько вещей. Также устарела документация по реактивному маршрутизатору. Это мой рабочий код:

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

Источник


11
В версии 4, когда вы используете «response-router-dom», нет необходимости импортировать «response-router». 'response-router-dom' завершен.
Mammad2c 03

4
Если у меня есть несколько тегов <Route ...> внутри BrowserRouter, я получаю эту ошибку: «Неперехваченная ошибка: <Router> может иметь только один дочерний элемент». Как исправить?
olefrank

1
@erp response-router-dom имеет больше возможностей, чем response-router. вы можете посетить документ. Но вам нужно использовать только один из них.
Mammad2c

2
@NSCoder нет, маршрутизатор также находится в 'response-router-dom', поэтому нет необходимости включать как 'response-router-dom', так и 'response-router'. Если вам нужны HashRouter и router вместе, вы должны включить response-router-dom.
Mammad2c

1
@olefrank вам нужно обернуть несколько <Route...>операторов в <switch>оболочку, а не оборачивать их <div>. Если вы используете <div>, это делает маршруты включенными, что означает, что если путь может соответствовать двум маршрутам, оба компонента будут отображаться. См. Полную информацию здесь: medium.com/@djoepramono/react-router-4-gotchas-2ecd1282de65
Мухаммад Ханнан

17

Какую версию React Router вы используете? Маршрутизатор версии 4 изменен с передачи класса browserHistory на передачу экземпляра browserHistory, см. Пример кода в новых документах .

Это привлекает множество людей, которые автоматически обновляются; миграционный документ будет недоступен «в любой момент».

Вы хотите добавить это вверху:

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

а также

<Router history={newHistory}/>

версия 4. Не могли бы вы преобразовать мой код в версию 4?
Mammad2c

где customHistoryопределяется?
SharpCoder,

извиняюсь. теперь лучше?
Чарльз Мерриам

4

Если вы хотите иметь несколько маршрутов, вы можете использовать такой переключатель,

import {Switch} from 'react-router'; 

тогда

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

3

У меня была такая же проблема в ES6, но когда я переключился на библиотеку response-router-dom, проблема была решена. Для всех поклонников ES6, мы идем:

npm install --save react-router-dom

В 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:или In index.jsx:?
Раз Галстян

@RazGalstyan index.js, если вы используете webpack.
Теоман Шипахи

1

Версия 4 React Router изменила несколько вещей. Они сделали отдельные элементы роутера верхнего уровня для разных типов истории. Если вы используете версию 4, вы сможете заменить ее <Router history={hashHistory}>на <HashRouter>или <BrowserRouter>.
Подробнее см. Https://reacttraining.com/react-router/web/guides.


0

Я также пишу практику входа в систему. А также ответьте на такой же вопрос, как и вы. После дневной борьбы я обнаружил, что this.props.history.push('/list/')можно сделать это только вместо того, чтобы тянуть много плагинов. Кстати react-router-domверсия есть ^4.2.2. Благодарность!

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

Приведенное ниже работает для меня с "response-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')
)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.