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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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