React Router V4 - 警告:您试图重定向到您当前所在的相同路线:“/ home / dashboard”

时间:2017-11-24 13:35:49

标签: reactjs react-router-v4

我遇到这个错误尝试了不同的路由方式仍然没有运气。

我有路由配置文件,即route.js

const Root = ({ store }) => (
    <Provider store={store}>
        <BrowserRouter>
            <div>
                <Route path='/' component={ App }/>  
            </div>
        </BrowserRouter>
    </Provider>
)

现在在App.js

class AppComp extends Component {
    render() {
        const {match} = this.props;
        let navClass = 'active';

        if(this.props.sideClass === "nav-ssh") {
            navClass = "active-ssh"; 
        }

        return (
            <div>
                <div className="container">
                    <div className="main">
                        <Route render={()=><Header sideNavClass={this.props.sideNavClass} />} />
                        <Route render={()=><SideNav navActiveClass={navClass} currentLocation={this.props.location.pathname} />}/>
                        <Redirect to="/home/dashboard" />s
                    </div>
                </div>
            </div>
        );
    }
}

我想加载应用程序,所以把它放在最高级别,标题和sidenav也应该总是加载,所以他们在应用程序内。

对于任何未知路径和第一次加载,我重定向到/ home / dashboard

据我所知它必须来/两次所以这个警告。

如何配置我的路由器以实现相同并解决警告。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:16)

使用<Switch>而不是<div>来包装路线,解决了我的问题。

import React from 'react'
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'
import { LoginScreen, LogoutScreen } from './components'

export default () => (
  <div>
    <Router>
      <Switch>
        <Route path='/login' component={LoginScreen}/>
        <Route path='/logout' component={LogoutScreen}/>
        <Route component={AuthenticatedRoutes}/>
      </Switch>
    </Router>
  </div>
)

答案 1 :(得分:2)

我解决了这个问题。这是一个解决方案。

route.js
<Provider store={store}>
  <BrowserRouter>
    <div>
      <Route path="/" component={ App }/>
    </div>
  </BrowserRouter>
</Provider>

在App.js添加支票match.url === window.location.pathname,对于初始呈现始终为真,因此'/'会重定向到'/home/dashboard'。添加此条件可解决重定向警告。

class AppComp extends Component {
  render() {
    const {match} = this.props;
    let 
        shouldRedirect = match.url === window.location.pathname, 
        redirectTo = <Redirect to="/home/dashboard" />;
    let navClass = 'active';
    if(this.props.sideClass === "nav-ssh") {
      navClass = "active-ssh"; 
    }
    return (
      <div>
        <div className="container">
          <div className="main">
            <Route render={()=><Header sideNavClass={this.props.sideNavClass} />} />
            <Route render={()=><SideNav navActiveClass={navClass} currentLocation={this.props.location.pathname} />}/>
            {shouldRedirect && redirectTo}
          </div>
        </div>
      </div>
    );
  }
}

但是你现在有一个限制,如果用户输入一些未知路径,那么它不会重定向到'/home/dashboard',即我们的默认路由。

要克服这个限制,你必须添加:

<Switch>
  {/*---- your additional routes goes here -----*/}
  <Redirect to="/home/dashboard" />
</Switch>

将上述代码添加到处理其余路由的组件中。例如对我来说,我已添加到Sidenav组件。

答案 2 :(得分:2)

即使我也遇到过类似的问题。当我在Route.Switch中添加确切时,它已经解决了。还必须添加Switch。

<Switch>
  <Route exact path='/' component={ App }/> 
</Switch> 

答案 3 :(得分:1)

我猜你会像

那样配置你的路线
<Provider store={store}>
    <BrowserRouter>
        <div>
            <Route path="/" component={ App }/>
        </div>
    </BrowserRouter>
</Provider>

和App.js为

class AppComp extends Component {
    render() {
        const {match} = this.props;
        let navClass = 'active';

        if(this.props.sideClass === "nav-ssh") {
            navClass = "active-ssh"; 
        }

        return (
            <div>
                <div className="container">
                    <div className="main">
                        <Route render={()=><Header sideNavClass={this.props.sideNavClass} />} />
                        <Route render={()=><SideNav navActiveClass={navClass} currentLocation={this.props.location.pathname} />}/>
                       <Switch>
                            <Route path='/home/dashboard' component={ Dashboard }/>

                             <Redirect to='/home/dashboard'/>
                       </Switch>
                    </div>
                </div>
            </div>
        );
    }
}

答案 4 :(得分:0)

有同样的问题 - 试图重定向但是收到错误,我相信你需要的只是切换:

<Route render={()=><Header sideNavClass={this.props.sideNavClass} />} />
  <Switch>
    <Route render={()=><SideNav navActiveClass={navClass} currentLocation={this.props.location.pathname} />}/>
    <Redirect to="/home/dashboard" />
  </Switch>
</Route>