Vue-Router

135 阅读2分钟

路由的注册与使用

引入Vue实例和Vue-router,并且应用路由插件

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
// Vue.use应用了插件上的install方法

路由配置

生成路由实例

const router = new VueRouter({配置项})

配置项

const router = new VueRouter({
   mode:'history', // 选择路由模式(hash/history)
   base:'xxx'// 客户端基础地址
   routes   // 引入配置项
})

const routes = [
  {
    // 路由规则
    path: '/',
    name: 'home',    // 命名路由  给当前的路由起一个名称
    component: () => import('../views/HomeView.vue'),// 懒加载的方式引入组件
    meta: {// 路由元信息 -- 页面传参的方式,对于当前的规则进行描述,权限描述
      data: '你好' 
    }
  },
  {
    path: '/news',
    component: () => import('../views/newsView.vue'),
    children: [  // chidren项中的是/news下面的嵌套子路由,子路由前面不加'/'
      {
        
        path: ':id',// 动态路由参数的定义,必须要先定义后,使用
        component: () => import('../views/detail.vue'),
        props: true   // 利用props传值,对应组件通过props中的对应属性获取
      }
    ]
  },
  {

    path: '/detail/:id',    // 动态路由参数的定义,必须要先定义后使用
    component: () => import('../views/detail.vue'),
    // 可以通过props,隐式传递数据
    /* props: router => {
      return { username: 'admin' }
    } */
    // 写boolean类型,可以方便我们去读取动态路由参数 通过 props来接受
    props: true
  },
  {
    path: '/admin',
    component: () => import('../views/admin.vue'),
    beforeEnter(to, from, next) {  // 路由独享前置守卫
      console.log('路由独享 -- beforeEnter')
      next()
    },
    // 重定向,将路由跳转到响应的路由
    // redirect: '/admin/welcome',
    children: [
      {
        // /admin/welcome
        path: 'welcome',
        component: () => import('../views/welcome.vue')
      }
    ]
  },
  {
    path: '*',    // 404页面,当路由表中的地址都无法匹配将会匹配这里的内容
    component: () => import('../views/notfound.vue')
  }
]

实例的导出及应用

export default router

在根组件中

new Vue({
  router,  // this.$route this.$router
  store,   // this.$store 在这里进行添加出来的属性
  render: h => h(App)
}).$mount('#app')

路由视图与导航

路由注册后将会产生Router-link,Router-view两组标签

<template>
  <div id="app">
    <nav v-if="show">
      <!-- 声明式导航 -->
      <router-link to="/">Home</router-link> <router-link to="/about">About</router-link>
      <router-link to="/news">news</router-link>
    </nav>
    <!-- 挂载点,路由匹配成功后,渲染的节点 -->
    <router-view />
  </div>
</template>

routeroute和router

使用$router可以进行路由的跳转,router为 VueRouter 实例,跳转到不同url,router.push方法

this.$router.push( )
this.$router.go( )
this.$router.replace( )
this.$router.back

$route

route进行路由参数的接收,监听route进行路由参数的接收,监听route不需要深度监听,当路由切换时,vue-route会重新创建$route对象,而不是更改内部数据

this.$route.query.xxx

this.$route.params.xx // 这里取的键名是根据在路由表中配置的键名

  1. 在路由表中配置props=true,将路径参数传入组件的属性中,但是并不能处理query参数
  2. 组件定义props:["xx"]将参数注入到组件的属性中

路由守卫

全局路由守卫

全局前置守卫 => router.beforeEach

全局的路由发生切换时执行

// next参考洋葱模型
router.beforeEach((to, from, next) => {
    // to:切换到的路径 from:发生切换的路径
  console.log('全局前置守卫')
  next() // 只有执行next方法才会往下渲染路由页面,可以在此进行响应的逻辑判断
})

全局解析守卫 => router.beforeResolve

当所有独享和组件守卫执行完毕后才会执行

router.beforeResolve((to, from, next) => {
  console.log('全局解析守卫')
  next()
})

全局后置钩子 => router.afterEach

router.afterEach((to, from) => {
  console.log('全局后置守卫')
})

路由独享守卫 => beforeEnter

可以在对应路由的路由表配置项中直接进行定义,当进入路由的时候触发相应的回调。

  {
    path: '/admin',
    component: () => import('../views/admin.vue'),
    beforeEnter(to, from, next) {
      console.log('路由独享守卫')
      next()
    },

组件守卫

组件前置守卫 => beforeRouteEnter

export default {
    beforeRouteEnter(to, from, next) {
    console.log('组件前置守卫')
    next()
  }
}

路由变化守卫 => beforeRouteUpdate

  // 动态路由参数,切换时才会触发
  beforeRouteUpdate(to,from,next){
    console.log('组件 -- beforeRouteUpdate',this.id);
    next()
  }

路由后置守卫 => beforeRouteLeave

  //早于生命周期的销毁阶段之前执行
  beforeRouteLeave(to, from, next) {
    console.log('组件内 -- beforeRouteLeave')
    next()
  }

总结

  1. 拥有next方法的守卫只有在执行的最后使用next()方法路由才会匹配执行,否则不会渲染。
  2. 可以使用watch监听'$route.path'查看路由变化
  3. 守卫的执行顺序:全局守卫>独享守卫>解析守卫
  4. 所有的守卫都可以多次调用,统一执行
  5. 守卫和生命周期执行顺序:

进入:全局前置>组件前置>生命周期创建阶段

离开:组件后置>全局后置>生命周期销毁阶段

未完待续..........