React Router V4 - Предупреждение: вы попытались перенаправить на тот же маршрут, в котором вы сейчас находитесь: "/home/dashboard"

Я получаю эту ошибку, пробовал разные способы маршрутизации, еще не повезло.

У меня есть файл конфигурации маршрута, т.е. 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

Я понимаю, что это должно быть дважды, чтобы это предупреждение.

Как настроить мой маршрутизатор для достижения того же и разрешить предупреждение.

Любая помощь будет принята с благодарностью.

Ответы

Ответ 1

Я решил проблему. Здесь решение.

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

Используйте <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>
)

Ответ 3

Даже я столкнулся с подобной проблемой. Это было разрешено для меня, когда я добавил точное в Route.Switch также необходимо добавить.

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

Ответ 4

Я предполагаю, что вы настроите свои маршруты как

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

и App.js as

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

Ответ 5

Если бы эта же проблема - пыталась перенаправить, но получала ошибку, и я считаю, что все, что вам нужно, это switch:

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