Vue-router 路由 (常见用法)

vue-router 的常见用法

一个完整的路由必须包含:路由链接和路由占位符、路由实例、路由规则链接的路由组件

1. 路由重定向

  • 路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面。
  • 通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

2. 嵌套路由

通过路由实现组件的嵌套展示,叫做嵌套路由。

2.1 声明子路由链接和子路由占位符

About.vue 组件中,声明 tab1 和 tab2 的子路由链接以及子路由占位符。示例代码如下:

2.2 通过 children 属性声明子路由规则

在 src/router/index.js 路由模块中,导入需要的组件,并使用 children 属性声明子路由规则:

3. 路由命名

  • 为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为“命名路由”。
//添加路由链接
//声明式导航
<router-link :to="{ name: 'user', params: { id: 123 }}">User</router-link>
//编程式导航
router.push({ name: 'user', params: { id: 123 }})

//定义路由规则
const router = new VueRouter({
    routes: [
        {
         path: '/user/:id',
         name: 'user',
         component: User
        }
    ]
})

4. 动态路由与路由匹配

  • 一个完整的路由必须包含:路由链接和路由占位符、路由实例、路由规则链接的路由组件
4.1 动态路由的概念

动态路由指的是:把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。

在 vue-router 中使用英文的冒号(:)来定义路由的参数项。示例代码如下:

4.2 $route.params 参数对象

动态路由渲染出来的组件中,可以使用 this.$route.params 对象访问到动态匹配的参数值

5. 路由传递参数和接收参数

<div id="app">
      <router-link to="/user/1">User1</router-link>
      <!-- 路由占位符 -->
      <router-view></router-view>
</div>
const User = {
         //组件的props属性接收参数
        props: ['id'],
         //props: ['uname', 'age'],
         //props: ['id', 'uname', 'age'],
        template: '<h1>User 组件 -- 用户id为: {{id}}</h1>'
}

// 创建路由实例对象
const router = new VueRouter({
    // 所有的路由规则
    routes: [
        { path: '/', redirect: '/user'},
         //props:true 开启传参
        { path: '/user/:id', component: User, props: true },
         //传对象类型props: { uname: 'lisi', age: 20 }
         //传函数类型props: route => ({ uname: 'zs', age: 20, id: route.params.id })
         //params传值
         { path: '/search', component: SearchUser,props: route => ({ query: route.query.q })}
         //query传值
    ]
})

6. 路由的懒加载

路由懒加载的应用场景:

  • 首先, 我们知道路由中通常会定义很多不同的页面.

  • 这个页面最后被打包在哪里呢? 一般情况下, 是放在一个js文件中.

  • 但是, 页面这么多放在一个js文件中, 必然会造成这个页面非常的大

  • 如果我们一次性从服务器请求下来这个页面, 可能需要花费一定的时间, 甚至用户的电脑上还出现了短暂空白的情况.

  • 如何避免这种情况呢? 使用路由懒加载就可以了

路由懒加载的作用:

  • p路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块.
  • 只有在这个路由被访问到的时候, 才加载对应的组件
6.1 路由懒加载的用法

在ES6中, 我们可以有更加简单的写法来组织Vue异步组件和Webpack的代码分割

const Home = () => import('../components/Home.vue')

例如:

// 配置路由相关的信息
import VueRouter from 'vue-router'
import Vue from 'vue'

// 原始路由加载
// import Home from '../components/Home'
// 路由懒加载(推荐)
const Home = () => imports('../components/Home')

// 1.通过Vue.use(插件), 安装插件
Vue.use(VueRouter)

const routes = [            // 在 routes 数组中,声明路由的匹配规则
  { 
    // path 表示要匹配的 hash 地址,component 表示要展示的路由组件  
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
]

const router = new VueRouter({
  // 配置路由和组件之间的应用关系
  routes,
  mode: 'history',
  linkActiveClass: 'active'
})

// 3.将router对象传入到Vue实例
export default router

7. 导航守卫(钩子函数)

我们可以利用beforeEach来完成标题的修改

  • 首先,我们可以在钩子当中定义一些标题,可以利用mate来定义

  • 其次,利用导航守卫修改我们的标题

导航钩子的三个参数解析:

  • to:即将要进入的目标的路由对象
  • from:当前导航即要离开的路由对象
  • next:调用该方法后,才能进入下一个钩子

全局守卫示例:

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

推荐阅读更多精彩内容

  • SPA单页应用 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候受网...
    视觉派Pie阅读 11,843评论 1 55
  • 路由 注入实例 此后可以在任何组件内通过 this.$router 访问路由器(或通过import导入router...
    李霖弢阅读 414评论 0 0
  • 一、什么是路由? 路由是通过互联的网络把信息从源地址传输到目的地址的活动 路由中有个非常重要的概念叫路由表,本质上...
    接下来的冬天阅读 410评论 0 0
  • vue-router 1.安装 vue-router 2.使用 vue-router 在 new Vue 实例的地...
    心安理得丶阅读 825评论 0 1
  • 第一个 vue-router 路由 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示hom...
    索伦x阅读 2,437评论 0 3