Реагировать на точный путь в Route не работает должным образом

Привет, у меня есть приложение для реагирования со страницей входа и главной страницей с маршрутами. У меня проблемы с пониманием того, как путь и точный путь на самом деле работают с реагирующим маршрутизатором в такой ситуации?

Вот мой код компонента App:

const PrivateRoute = ({ component: Component , ...rest }) => {
    const { userAuth, getUser } = useContext(AuthContext);
    return (
        <Route
            {...rest}
            render = {props => !userAuth ? <Redirect to='/login' /> : <Component {...props} />}
        />
    )
}

function App(props) {
    return ( 
        <AuthState> 
            <Switch>
                <Route path='/login' component = {SignIn} /> 
                <PrivateRoute exact path='/' component = {MainPage} /> !!! // When i switch this to path only it works fine
            </Switch> 
        </AuthState>
    );
}

export default App;

А вот часть кода компонента main:

<main className = {classes.content}>
    <div className = {classes.toolbar} />
    <Switch>
        <Route path='/dataSets' component = {DataSet} />
        <Route path='/dasboard' component = {Dashboardmain} />
        <Redirect from='/' to='/dasboard' /> 
    </Switch>
</main>
</div>

Поэтому, когда я устанавливаю так:

<PrivateRoute exact path='/' component = {MainPage} />

Маршруты /dasboard и dataSets не отрисовываются, просто изменены URL-ы

Но если я настрою так:

<PrivateRoute path='/' component = {MainPage} />

Все работает нормально.

Любая помощь в понимании такого поведения?

Привет, я решил твою проблему?? Если да, пожалуйста, примите

Anil Loutombam 23.12.2020 10:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте так в своем App.js

<Router>
  <Route path = "/login" component = {MyLoginForm} />
  <PrivateRoute path = "/onlyAuthorizedAllowedHere/" component = {MyComponent} />
</Router>

И компонент PrivateRoute

import React from 'react'
import AuthService from './Services/AuthService'
import { Redirect, Route } from 'react-router-dom'

const PrivateRoute = ({ component: Component, ...rest }) => {

  // Add your own authentication on the below line.
  const isLoggedIn = AuthService.isLoggedIn()

  return (
    <Route
      {...rest}
      render = {props =>
        isLoggedIn ? (
          <Component {...props} />
        ) : (
          <Redirect to = {{ pathname: '/login', state: { from: props.location } }} />
        )
      }
    />
  )
}

export default PrivateRoute
Ответ принят как подходящий

exact — очень полезная подсказка, если вы ее понимаете. Базовый вы можете понять это так:

Давайте использовать exact, когда вы хотите, чтобы пользователь перешел именно по тому маршруту (URL), который вам нужен. Если этот маршрут является родительским и у него есть несколько дочерних маршрутов, не используйте exact с родительским маршрутом, вместо этого используйте его для дочерних маршрутов.

В вашем примере мы можем понять так

  1. Помните, что у нас всегда есть родитель маршрута /

  2. Login является потомком /, он не содержит дочернего маршрута =>, поэтому давайте добавим exact для этого маршрута

  3. MainPage также является дочерним элементом /, но является родителем Dashboardmain и DataSet, поэтому НЕ добавляйте exact вместо /

  4. Dashboardmain и DataSet являются потомками /, но они не содержат дочернего маршрута =>, поэтому давайте добавим для них exact

Та же логика с вложенными маршрутами. Вы можете создать несколько вложенных маршрутов с моим объяснением выше. Удачи!

Другие вопросы по теме