Vue 路由管理_2023-01-15

1. 简介

  • 日常网站,经常需要进行页面的跳转,对于单页面网站,就是通过不同组件的渲染来呈现不同的功能页面。比如用户单击注册按钮,切换至注册页面。单击导航选项切换至对应的页面。用户的切换操作,产生一个路径,路由管理器通过路径在指定的位置渲染不同的组件,从而实现单页面网站。
  • 路径并不仅仅是用户点击切换,也可以是在地址栏上进行操作。因为路径也类似于网址。
  • 而路由管理器,就是管理这种对应关系,用来链接组件、组件渲染位置、路径。这种对应关系也称为路由。

2. 路径这个样子

  • 看到一个#号了吧。。这个就是路径
  • 注意,如果安装了路由管理器,访问http://localhost:8080/网址,会自动跳转http://localhost:8080/#/这个路径。所以路由表需要能够处理这个路径(或通过路由守卫进行跳转)
http://localhost:8080/#/home

3. Vue的路由管理器安装

npm install vue-router@4 -s

4. Vue的路由管理器的使用

  • 因为路由表会越来越大,所以最好是另外在一个js文件上单独管理路由表。如下是一个router.js文件
  • routes是一个路由对象数组。里面有路由的信息。文章后面会介绍路由对象的详细属性作用。
  • 可以看到,使用了路由管理器后,组件都需要交给路由管理器管理。。除了根组件。
  • 如下定义了一个根路由,路径是/home,这个路径会把HomePage这个组件渲染在根组件的<router-viem>位置上
  • 如下路由还定义了一个别名,alisa可以设置为字符串或一个数组。
  • 如下路由还有一个name属性,可以更方便的跳转到这个路由
import {createRouter, createWebHashHistory} from 'vue-router'
import ResultShow from '../components/ResultShow'

const routes = [
    {path: '/home', component: HomePage, name:,alias:"/home/ll"},
]

const router = createRouter({history: createWebHashHistory(), routes: routes,})

export default  router
  • main.js注册这个路由管理器
//导入路由配置
import router from './config/router'
const app =createApp(App)
app.use(router)

5. route-link

router-link可以理解为一个a元素,用户点击这个link会自动触发path的路径,然后路由管理器根据path在指定的位置渲染路由表上的组件。

<router-link to="some path"></router-link>

6. 路径的高级用法

6.1带参数路径

  • 如下表示带了2个参数,这些参数保存在$route.params.user。组件可以直接引用。注意这个参数是全局的参数。
 {path: '/home/:user/:id', component: HomePage, }

6.2指定参数个数

  • 如下表示带了多个参数,/home/xiaoli/xiaowang都匹配这个规则,此时$route.params.user返回一个数组
 {path: '/home/:user*', component: HomePage, }

6.3指定参数是否必须

  • 如下表示参数非必须。如果没有这个符号,必须有参数才会跳转到这个组件
 {path: '/home/:user?', component: HomePage, name:}

7. 路由的嵌套

  • 如果要渲染的路由位置不是在根组件,而是在某一个组件下面,可以用如下方法。
  • 此时Friends组件会被渲染在HomePage组件的router-view上。
const routes = [
    {
      path: '/home', 
      component: HomePage, 
      children:[
        {
          path:friends,
          conponent:Friends
        }
      ]
    },
]

8. 动态页面导航

  • 采用这个办法可以动态进行导航,而不仅仅依靠</router-link>组件。可以在用户的单击事件中调用这个方法。比如导航菜单中点击导航项后进行导航
  • 注意name导航方法,需要和路由表的name一致。即通过名称访问方式
  • 指定了path访问方法,params参数会自动忽略
this.$router.push("/home")
this.$router.push({
  name:,
  params:{},
  query:{},
  path:
})
  • 注意。。push是在浏览器的前进后退上增加导航记录。如果不希望增加导航记录,可以用replace方法代替push。参数都一样。

9. 路由视图的高级用法

9.1路由视图的命名

  • 路由视图可以命名,以便支持多个同级路由视图
  • 没有进行命名的视图,默认带有default命名
<router-viem name="main"><router-viem>

9.2 在路由表指定组件对应的具体路由视图

  • 如下表示一个路径,同时在多个组件视图上渲染多个组件。。当然也可以只在一个路由视图渲染一个组件。
{
  path:"/home"
  components: {
      main:Components1,
      default:Components2
  }
}

10. 路由的重定向

路由的重定向表示访问这个路由后直接跳转至新路由。

  • 直接指定路径
{
  path:
  redirect:"/login"
}
  • 指定参数、路由name等。属性和$router.push一致
{
  path:
  redirect:{
    name:pathName,
  }
}
  • 指定为一个函数,返回如上的对象
{
  path:
  redirect: to=>{
      console.log(to)
      return {path:,}
  }
}

11. 路由传参数

  • 之前说了路由可以带参数,可以直接访问$route.params.username获得参数。。但是这方法不好。。组件重复性不够高。。也不够安全。。比较这些参数是全局的。。同时也是变动的。。同时和路由管理器紧紧绑定在一起了。
  • 此时可以用路由传参的方法。
  • 如下代码的id参数会自动传递给组件的props中名为id的参数
     const routes = [
       { path: '/user/:id(\\d+)', component:UserSetting, props:true }
     ]

如果一个路径对应多个路由视图,需要如下

     const routes = [
       { path: '/user/:id(\\d+)', component:UserSetting, props:{routeViewName1: true, routeViewName1: true} }
     ]
  • 如果要抛弃路由自带的参数,重新指定参数,可以如下。
  • 可以看到通过路由传参的方式,可以更加个性的渲染组件,组件也更加可以复用
     const routes = [
       { path: '/user/:id(\\d+)', component:UserSetting, props:{propName:value} }
     ]
  • 还有一种更强大的方法,即props可以设置为函数方式
  • 可以看到路由传参是传值。。意思就是通过这个值来渲染组件。
     const routes = [
       { path: '/user/:id(\\d+)', component:UserSetting, props:route=>{
            return {
                          id: route.params.id,
                      }
        } }
     ]

12. 路由守卫

  • 守卫路由守卫,就是在路由跳转前或后执行的一段函数。可以理解为一个路由事件。作用是允许或拒绝路由跳转,比如用户没有登录,所有跳转都拒绝。有很多种方式可以定义路由守卫。比如全局路由守卫、或针对单独路由的守卫
  • 路由守卫返回true表示同意此次跳转,false表示拒绝。更多的情况下是返回一个对象,该对象和$router.push()方法的对象一样。

12.1 全局路由

  • 全局路由定义在如上route.js的router对象上。
  • beforeEach为路由前置守卫。afterEach为路由后置守卫。
router.beforeEach((to, from)=>{
  console.log(to)
  return false //拒绝此次跳转
})
router.afterEach

12.2 特定路由的路由守卫

  • 注册到路由表即可
  • 有如下守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
routes = [
{
  path:,
  beforeRouteEnter: (to, from, next)=>{} //next为一个函数,路由放行后执行
  beforeRouteEnter: (route)=>{}
 }
]

13. 路由的动态管理

  • 在静态路由表写死的叫静态路由。如果需要在代码中动态增加路由,可以用如下方法
  • 很容易理解,增加路由传入的是一个路由对象,删除的话是一个路由名称。getRoutes返回全部路由对象数组。
$router.addRoute()
$router.removeRoute()
$router.getRoutes()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容