道具“历史”在“路由器”中被标记为必需,但是其值为“未定义”。在路由器中


96

我是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失败的道具“历史记录”,未定义

未定义值时,如何解决历史记录标记为必需的问题?

升级React-Router并将hashHistory替换为browserHistory

和网络上的许多搜索,但我无法解决此问题。React Router是版本4

Answers:


170

如果您使用的是react-router v4,则还需要安装react-router-dom。之后,从react-router-dom导入BrowserRouter并将Switch Router切换为BrowserRouter。v4似乎改变了几件事。而且,react-router文档已过时。这是我的工作代码:

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中,当您使用“ react-router-dom”时,无需导入“ react-router”。“ react-router-dom”已完成。
Mammad2c

4
如果我在BrowserRouter内有多个<Route ...>标记,则会出现此错误:“未捕获的错误:<Router>可能只有一个子元素”。怎么修?
olefrank

1
@erp react-router-dom比react-router有更多选择。您可以访问该文档。但是您只能使用其中之一。
Mammad2c

2
@NSCoder不,路由器也位于“ react-router-dom”中,因此无需同时包含“ react-router-dom”和“ react-router”。如果同时需要“ HashRouter”和“ router”,则必须包括“ react-router-dom”。
Mammad2c

1
@olefrank,您需要将多个<Route...>语句<switch>包装在wrapper中,而不是将它们包装在中<div>。如果使用<div>,这将使路由包含在内,这意味着如果路径可以匹配两个路由,则两个组件都将呈现。详情请见:medium.com/@djoepramono/react-router-4-gotchas-2ecd1282de65
Muhammad Hannan

17

您正在使用哪个版本的React Router?路由器版本4从传递browserHistory类更改为传递browserHistory实例,请参阅新docs中代码示例

这吸引了很多自动升级的人。迁移文档将“现在每天”发布。

您要将其添加到顶部:

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

<Router history={newHistory}/>

版本4。能否将我的代码转换为版本4?
Mammad2c

在哪里customHistory定义?
SharpCoder

抱歉。现在好点了?
Charles Merriam

4

如果您想拥有多条路线,可以使用像这样的开关,

import {Switch} from 'react-router'; 

然后

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

3

我在ES6中遇到了同样的问题,但是当我切换为使用“ react-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)。
Teoman shipahi

1

React Router的第4版更改了几件事。他们为不同的历史记录类型创建了单独的顶级路由器元素。如果您使用的是版本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

下面为我​​使用“ 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')
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.