React Router — должен ли я отображать все маршруты одновременно?

#javascript #reactjs #react-router

#javascript #reactjs #реагирующий маршрутизатор

Вопрос:

Предположим, у меня есть приложение, в котором вы можете войти как пользователь, так и администратор, и у меня есть эти маршруты:

  • вход
  • Регистрация
  • Главная
  • Панель администратора (доступна только для администраторов)
  • Мой профиль (доступен только для пользователей)

У меня был бы коммутатор с такими маршрутами:

 <Switch>
    <UnloggedRoute exact path='/login'>
        <Login />
    </Route>
    <UnloggedRoute exact path='/register'>
        <Register />
    </Route>
    <PrivateRoute exact path='/'>
        <HomePage />
    </Route>
    <AdminRoute exact path='/admin'>
        <Admin />
    </Route>
    <UserRoute exact path='/profile'>
        <Profile />
    </Route>
</Switch>
  

Итак, внутри PrivateRoute у меня есть условие, которое проверяет, вошел ли пользователь в систему, если нет, он перенаправляет на /login . В AdminRoute нем проверяется, является ли пользователь администратором, если нет, перенаправляет на / и у UserRoute меня есть условие, которое проверяет, является ли пользователь обычным пользователем, если нет, перенаправляет на / .

Наконец, у UnloggedRoute меня есть проверка, вошел ли пользователь в систему. Если это так, то он переходит к / .

Итак, мой вопрос: должен ли я оставить коммутатор таким, какой он есть, или я не должен отображать «Профиль» маршрута, если пользователь является администратором? Вот так:

 user.isAdmin() amp;amp; (
    <Route exact path='/admin'>
        <Admin />
    </Route>
)
  

Я чувствую, что первый способ более декларативный и его легче понять и управлять, но я хочу услышать мнения…

Ответ №1:

Итак, для моего приложения я сделал что-то очень похожее на то, как вы делали это первым способом. Мне приходилось иметь дело с 4 разными логинами, используя 5 разных маршрутов: MainRoute , TeacherRoute , StudentRoute , TutorRoute , и AdminRoute . Для моего использования я просто проверил каждый из этих маршрутов accountType (или isAdmin() в вашем случае) внутри самого маршрута следующим образом:

 const PrivateRouteAdmin = ({ component: RouteComponent, ...rest }) => {
  const { currentUser } = useContext(AuthContext);

  //If login is good, allow access or redirect to login
  if (!!currentUser) {
    return (
      <Route
        {...rest}
        render={routeProps =>
          (currentUser.isAdmin()) ? (
            <RouteComponent {...routeProps}
              currentUser={currentUser} />
          ) : (
              <Redirect to={"/incorrect-login"} />
            )
        }
      />
    )
  } else {
    //Bad login
    return (
      <Route
        {...rest}
        render={() => (
          <Redirect to={"/login"} />
        )}
      />
    )
  }
}

export default PrivateRoutedAdmin;
  

Пока вы проверяете маршруты таким образом внутри маршрутов, вам не нужно делать isAdmin() внутри Switch .

Кроме того, чтобы все было немного более организованно в вашем Switch , я бы сделал:

 <AdminRoute exact path='/admin' component={Admin} />