当所有路由根据条件动态加载时如何重定向到路由?

Posted

技术标签:

【中文标题】当所有路由根据条件动态加载时如何重定向到路由?【英文标题】:How to redirect to route when all routes are loaded dynamically based on condition? 【发布时间】:2021-08-10 04:09:55 【问题描述】:

这是我根据上下文中的用户对象加载路由(反应路由器 dom 5)的代码。

function App() 
  return (
      <UserContextProvider>
        <BrowserRouter>
          <Navigation/>
        </BrowserRouter>
      </UserContextProvider>
  );

导航代码。这里我有条件地加载路由。

function Navigation() 

  const  contextState  = useUserContext();

  const routes = contextState.user ? routesAuthenticated : routerUnauthenticated;
  
  return (
    <Switch>
        routes.map((route, index) => 
            return (
                <Route
                    key=index
                    path=route.path
                    exact=route.exact
                    render=(props: RouteComponentProps) => (
                        <route.component name=route.name ...props ...route.props />
                    )
                />
            );
        )
    </Switch>
  );

您会看到,基于上下文用户对象,我加载了不同的路由。 路由是简单的配置文件:

export const routerUnauthenticated: IRoute[] = [
  
    path: '/register',
    name: 'Register page',
    component: RegisterPage,
    exact: false,
  ,
  
      path: '/login',
      name: 'Login page',
      component: LoginPage,
      exact: false,
  ...

问题是我在路线http://localhost:3000/login 上,成功登录后,我得到了路线http://localhost:3000/login 的空白页面。 在登录之前,我有 3 条路由登录/注册/主页。 登录后,我有 5 条路线仪表板/个人资料... 我要做的是在成功登录后到达/dashboard 路由,但由于我的想法是动态路由加载,我不知道如何导航。

在我的上下文中登录是一个简单的假功能:

try 
        setContextState( type: ContextActions.LOGIN_IN_PROGRESS );

        setTimeout(() => console.log( userId: 1, username: 'admin@admin.com' );
          setContextState( type: ContextActions.LOGIN_SUCCESS, payload:  user:  userId: 1, username: 'admin@admin.com'   );
        , 3000);
       catch(error) 
        setContextState( type: ContextActions.LOGIN_ERROR );
      

【问题讨论】:

【参考方案1】:

这是被广泛使用的最常见的protectedRoute组件。

const App = () => 
    const  user  = useAuth();
  return (
    <Router>
        <Route path="/public">
          <Public />
        </Route>
        <Route path="/login">
          <Login />
        </Route>
        <PrivateRoute path='/protected' user=user>
          <Protected />
        </PrivateRoute>
      </div>
    </Router>
  )


const PrivateRoute = ( children, user, ...rest ) => (
    <Route ...rest render=( location ) => 
      return user === null
        ? <Redirect to=
            pathname: '/login',
            state:  from: location 
          
        />
        : children
     />
)

【讨论】:

【参考方案2】:

为什么不直接加载所有路由? 您可以使用自定义 Route 组件来查看 contextState.user 是否存在 有点像一个受保护的路由,如果未经身份验证的用户转到该路由,它会重定向到 /login 或 /register。

【讨论】:

这个问题需要正确回答这种查询或解释可以在cmets中给出 其实最后我是这样解决的。感谢您提供有关受保护路线的想法。 @1110 添加了一个常用的protectedRoute 组件,看看是否有帮助:)

以上是关于当所有路由根据条件动态加载时如何重定向到路由?的主要内容,如果未能解决你的问题,请参考以下文章

EmberJS嵌套动态路由不会按预期重定向

vue中路由的动态keepAlive

如何根据 Angular 2 中的条件重定向到某个路由。

条件满足后,私有路由不重定向

在 AWS Amplify 控制台上部署为 SPA 后,Nuxtjs 动态路由在页面重新加载时不起作用

路由到父路由时销毁所有子组件