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


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 预定程序员 2024-04-24 17:45 采纳率: 68.3% 浏览 2 首页/ 编程语言 / vue项目路由重定向之后匹配路由的问题 javascriptvue.js前端框架 问题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')} ]} ] 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 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 的主组件,没有布局层。不过,根据实际项目需求,可能还是保留布局组件更为合理。

      展开全部

      评论 编辑记录
    • 码农阿豪 Java领域优质创作者 2024-04-24 17:45
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      解答1: 这是因为在路由定义中,先定义了路径为/的重定向规则,将请求重定向到/home路径,所以即使最初进入页面是路径为/,也会根据定义的重定向规则被匹配到并重定向到/home路径。 解答2: 虽然在路由定义中已经定义了路径为/的重定向规则,将请求重定向到/home路径,但是在实际的开发中,可能还需要为路径为/home的页面加上一些特定的子路由。因此,在定义重定向规则后,还需要在路由定义中加上一个二级路由,以便后续添加相应的子路由规则。 示例代码: 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') } // 在这里添加子路由规则 ] } ] 注意:为了方便阅读,上述代码中将代码进行了缩进和换行处理,实际编写代码时应该根据自己的习惯进行格式化。同时,在实际开发中,二级路由可能是必要的,也可能是不必要的,需要根据具体情况进行判断和决定。

      评论
    • GISer Liu 2024-04-24 18:04
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      问题1:首先,让我们理解路由重定向的工作原理。在你的路由配置中,有这样一条规则:{path:'/',redirect:'/home',component:()=>import('@/Layout/index.vue')},它的作用是如果用户访问根路径 /,则重定向到 /home。当你在 LoginView.vue
      中成功登录后,执行了 this.$router.replace('/home'),这实际上是在告诉路由器立即将路径重定向到 /home。但在 Vue Router 中,重定向仅是路径的重定向,不会影响到浏览器的历史记录。因此,虽然路径已经被重定向到了 /home,但浏览器的地址栏仍然显示着 /。因此,Vue Router 仍然会尝试匹配根路径 /,并且找到了对应的重定向规则,于是执行了该规则,重定向到了 /home
      问题2:在你的路由配置中,为什么即使已经有了根路径的重定向规则 {path:'/',redirect:'/home',component:()=>import('@/Layout/index.vue')},你仍然需要在下面写一个二级路由 {path:'/home',component:()=>import('@/views/HomeView.vue')}
      呢?这是因为路由的匹配是从上到下依次匹配的,一旦找到了匹配的规则,就会停止匹配。在你的情况下,如果没有这个二级路由规则,当用户访问 /home 时,虽然会被重定向到 /home,但此时没有匹配的二级路由规则,因此不会显示任何内容。为了确保 /home
      能够正确匹配到对应的组件,你需要在路由配置中显式地声明 {path:'/home',component:()=>import('@/views/HomeView.vue')},这样当用户访问 /home 时,Vue Router 就能够找到匹配的规则,显示相应的组件内容。
      基于以上问题分析,你可以对路由配置进行如下修改:
      javascript
      Copy code

      const routes = [
      { path: '/login', name: 'login', component: () => import('@/views/LoginView.vue') },
      {
      path: '/',
      component: () => import('@/Layout/index.vue'),
      children: [
      { path: '/home', component: () => import('@/views/HomeView.vue') }
      ]
      },
      { path: '/', redirect: '/login' } // 将根路径重定向到登录页面
      ];
      

      这样,当用户访问根路径 / 时,会被重定向到登录页面 /login;而 /login 和 ``` /home

      ``` 则分别匹配到对应的组件。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    BAT 面试题集合
    FastSAM 部署 rknn
    不同类型的物联网产品、物联网产品的优势
    day22集合01
    ​@Async​
    中国预制菜行业发展形势与前景规划建议报告2022-2028年版
    运维网关系列2:实现细节
    从硬件缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析、单例模式案例
    GetPrivateProfileSection使用
    redis笔记 三 redis持久化
  • 原文地址:https://ask.csdn.net/questions/8094255