预定程序员 2024-04-24 17:45 采纳率: 67.4%
浏览 6

vue项目路由重定向之后匹配路由的问题

问题1:首先进入页面,路径为/,重定向到login登陆页面,登陆成功后,LoginView.vue文件写this.$router.replace('/home');进入到/home路径的页面,为什么执行{path:'/',redirect:'/home',component:()=>import('@/Layout/index.vue'),这个路由规则,匹配了路径为/的?这是为什么
问题2:为什么{path:'/',redirect:'/home',component:()=>import('@/Layout/index.vue'),中已经重定向到/home路径了,下面还写一个二级路由 {path:'/home',component:()=>import('@/views/HomeView.vue')},这是为什么?


const routes = [
  {path:'/',redirect:'/login',component:LoginView},
  {path:'/login',name:'login',
    component:()=>import('@/views/LoginView.vue')},
  {path:'/',redirect:'/home',component:()=>import('@/Layout/index.vue'),
    children:[
      {path:'/home',component:()=>import('@/views/HomeView.vue')}
    ]}
]
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-24 17:45
    关注

    引自免费微信小程序:皆我百晓生

    对于您的第一个问题,Vue 路由的工作方式是首先检查当前的 URL 是否与任何一个路由规则匹配。在您提供的路由配置中,有两个条目都指定了path: '/'。当用户访问根路径(即"/")时,Vue Router 会找到第一个匹配项并执行相应的操作。

    1. 首先,它会遇到第一个 / 的规则,该规则将用户重定向到 /login
    2. 登录成功后,您的 LoginView.vue 文件中的 this.$router.replace('/home') 将改变当前的 URL 到 /home
    3. 然而,尽管 URL 已经变为 /home,但 Vue Router 在渲染之前仍然会遍历所有路由定义以构建应用的视图结构。当它再次遇到第二个 / 的规则时,由于此时的 URL 是 /home,并且该规则有一个子路由也指向 /home,所以它认为有必要加载该布局组件(@/Layout/index.vue)以及其子组件(@/views/HomeView.vue)。

    解决方法是调整路由配置,确保不会对同一个 URL 进行两次处理。可以删除第二个 {path:'/',redirect:'/home'...} 条件,因为这并不是必要的。以下是修改后的路由配置:

    const routes = [
      { path: '/', redirect: '/login', component: LoginView },
      { path: '/login', name: 'login', component: () => import('@/views/LoginView.vue') },
      { 
        path: '/home', // 将重定向移到这里
        component: () => import('@/Layout/index.vue'),
        children: [
          { path: '', component: () => import('@/views/HomeView.vue') } // 使用空字符串''作为默认子路由
        ]
      }
    ];
    

    对于您的第二个问题,之所以有 {path:'/home',component:()=>import('@/views/HomeView.vue')} 子路由,是因为通常我们会在一级路由中设置一个布局组件,然后在该布局组件内部展示具体的子页面。在这个例子中,@/Layout/index.vue 可能是一个包含导航栏、页脚等全局元素的布局,而 {path:'/home'} 下的子路由 {path:'',component:()=>import('@/views/HomeView.vue')} 是在布局中显示的具体主页内容。这样做的好处是可以复用布局,并且每个子页面有自己的独立状态管理。

    如果您不希望看到这个额外的子路由条目,您可以直接在一级路由中导入 HomeView.vue,如下所示:

    const routes = [
      { path: '/', redirect: '/login', component: LoginView },
      { path: '/login', name: 'login', component: () => import('@/views/LoginView.vue') },
      {
        path: '/home',
        component: () => import('@/views/HomeView.vue')
      }
    ];
    

    这样做的话,HomeView.vue 就会成为 /home 的主组件,没有布局层。不过,根据实际项目需求,可能还是保留布局组件更为合理。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月24日

悬赏问题

  • ¥15 VS2022 C++的相关代码问题咨询
  • ¥15 如果要做一个老年人平板有哪些需求
  • ¥15 k8s生产配置推荐配置及部署方案
  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥30 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码