首页 > 其他分享 >vue-router 路由

vue-router 路由

时间:2022-12-24 19:23:24浏览次数:60  
标签:vue 守卫 跳转 组件 router path 路由

安装及引入

// 安装
npm i vue-router
// 引入 main.js
...
import VueRouter from "vue-router"
...
Vue.use(VueRouter)
...

new Vue({
  router,  // Vue 实例上创建
  render: h => h(App),
}).$mount('#app')

 配置路由

编写路由配置项

   路由配置文件通常创建在 src/router/index.js

// src/router/index.js
// 引入VueRouter import VueRouter from 'vue-router' // 引入路由组件 import About from '../components/About' import Home from '../components/Home' // 创建router实例对象,去管理一组一组的路由规则 const router = new VueRouter({ routes:[ { path:'/about', component:About }, { path:'/home', component:Home } ] }) // 暴露router export default router

实现路由切换

   在切换处(如导航栏)配置 router-link 组件, 并通过 router-view 指定展示位置

<router-link active-class="active" to="/about">About</router-link>
<router-view></router-view>

  注:1.路由组件通常存放在 pages 文件夹,一般组件通常存放在 components 文件夹

    2.通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。(可使用 keep-alive 组件缓存路由)

    3.整个 Vue 实例只能有一个 router ,可以通过组件的 $router 属性获取到

命名路由

  当路由层级过多时,可以使用命名的方式来简化路径配置,如下:

{
   path:'/demo',
   component:Demo,
   children:[
      {
         path:'test',
         component:Test,
         children:[
            {
               name:'hello', //给路由命名
               path:'welcome',
               component:Hello,
            }
         ]
      }
   ]
}

  简化跳转:

// 简化前,需要写完整的路径
<router-link to="/demo/test/welcome">跳转</router-link>

// 简化后,直接通过名字跳转
<router-link :to="{name:'hello'}">跳转</router-link>

// 简化写法配合传递参数
<router-link 
   :to="{
      name:'hello',
      query:{
         id:666,
         title:'你好'
      }
   }"
>跳转</router-link>

多级路由

  路由中可嵌套路由,实现多级路由配置,通过 children 配置项,配置子路由。

   routes:[
       {
           path:'/about',
           component:About,
       },
       {
           path:'/home',
           component:Home,
           children:[ //通过children配置子级路由
               {
                   path:'news', //此处一定不要写:/news
                   component:News
               },
               {
                   path:'message',//此处一定不要写:/message
                   component:Message
               }
           ]
       }
   ]

  路由跳转时,要写完整路径

<router-link to="/home/news">News</router-link>

接收参数

  路由切换时,可以向组件内传递参数,以下是几种传参方式

query参数

// 写法一
<router-link :to="/home/message/detail?id=666&title=你好">

// 写法2
<router-link 
   :to="{
      path:'/home/message/detail',
      query:{
         id:666,
         title:'你好'
      }
   }"
>跳转</router-link>

  获取参数:

this.$route.query.id
this.$route.query.title

params参数

  声明参数:

{
   name:'home',    
   path:'/home/:id/:title', //使用占位符声明接收params参数
   component:Home,
}

  配置参数:

// 写法1
<router-link :to="/home/666/你好">跳转</router-link>

// 写法2
<router-link 
   :to="{
      // 注意,使用此种写法,必须用name配置路由
      name:'home',    
      params:{
         id:666,
         title:'你好'
      }
   }"
>跳转</router-link>

  接收参数:

this.$route.params.id
this.$route.params.title

props参数

  路由还可通过配置项中的 props 属性传值,由组件的 props 接收

  分为三种写法:

  1.直接传值(不灵活)

{
    path:"/home",
    component: Home,
    props:{ id: 666, title: '你好'}
}

  组件中的 props 配置:

props:[ "id", "title" ]

  2.配合 params 参数,此时配置项中的 props 为一个 boolean  值,会把接收到的所有的params参数传递给组件中的props。

{
    path:"/home",
    component: Home,
    props: true
}

  3.配合 query 参数,通过函数返回值的形式,传入 query 参数,配合组件中的 props 接收

props({query}){
    return{
        id: query.id,
        title: query.title,
    }
}

  解构的对象参数打印在控制台如下:

replace

  浏览器的历史记录有两种写入方式:分别为 push 和 replace ,push 是追加历史记录,replace 是替换当前记录。路由跳转时候默认为 push   开启 replace 模式:
<router-link replace .......>News</router-link>

编程式路由导航

  不借助 <router-link> 组件,也可实现路由跳转,比如我们想使用 Button 按钮控制路由跳转,就可以绑定如下方法:
// push 跳转
this.$router.push({
   name:'home',
   params:{
      id:xxx,
      title:xxx
   }
})

// replace 跳转
this.$router.replace({
   name:'about',
   params:{
      id:xxx,
      title:xxx
   }
})
this.$router.forward() // 前进
this.$router.back() // 后退
 // 可前进也可后退,参数为一个number,1为前进1步,-2为后退两步,0为刷新页面
this.$router.go(1)

缓存路由组件

  当我们想让不展示的路由组件保持挂载,不被销毁,可以采用 keep-alive 组件。   如下所示,include 表示指定的缓存路由(参数为路由的name属性),若不指定,则默认缓存 <router-view> 展示的所有路由,如想指定多个,则可用数组
<keep-alive include="home"> 
   <router-view></router-view>
</keep-alive>

路由守卫

  通常用来对路由进行权限控制

// 路由配置
routes:[
    {
        name:"about",
        path:"/about",
        component: About,
        // 路由元信息,可以存点路由独有的信息
        meta:{
            // 是否需要路由守卫权限校验,true为需要,false或不写为不需要直接跳转
            isAuth:true,
        }
    },
    {
        name:"home",
        path: "/home",
        component:Home,
        meta:{
            isAuth: true,
        }
    }
]

全局守卫

  所有路由都要执行

全局前置守卫

  切换之前 和 初始化时 被调用

  下述代码中,若 a = 2,则进行切换时什么也不会发生

  next() 方法不传入参数表示保持默认跳转

  next( false ) 表示拒绝跳转,继续保持当前路由

  next( 路由路径 ) 表示跳转到指定路由。路由路径既可以是 router-link 标签上 to 使用的对象,也可使是 配置项中的 path

const a = 1
// 全局前置路由守卫
// to:去哪, from: 来自哪, next():放行
router.beforeEach((to, from, next)=>{
    console.log("to:");
    console.log(to);
    console.log("from:");
    console.log(from);
    if (to.meta.isAuth){  // 是否需要校验权限
        // next()是正确运行路由,此处若条件不符合,则无法执行路由
        if( a === 1){
            next()
        }
    }else {
        next()
    }
})

  如下所示,to 和 from 参数分别表示上一个路由和下一个路由对象

全局后置守卫

  切换之后 和 初始化时 被调用,若没有成功通过,则不会调用

// 全局后置路由守卫
// 切换之后和初始化时候被调用
// to:去哪, from: 来自哪
// 没next,因为已经切过去了
router.afterEach((to, from)=>{
    // do something
})

独享路由守卫

   直接在配置项中,为某个路由配置路由守卫(只有前置守卫,没有后置守卫)

// 路由配置
routes:[
    {
        name:"about",
        path:"/about",
        component: About,
        meta:{
            isAuth:true,
        },
     // 独享路由守卫 beforeEnter:((to, from, next)=>{ // 逻辑和全局前置一样 }) } ]

组件内路由守卫

  配置在组件当中的钩子

//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
}

路由守卫执行顺序

  1.首先可以看到,刚进入时,没有进入任何路由,在初始化阶段会执行全局前置守卫和全局后置守卫

 

   2.进入 About 展示页,可以看到,路由守卫执行顺序为:全局前置守卫 => 独享守卫 => 组件前置守卫 => 全局后置守卫

  3.再进入 Home 展示页,可以看到,路由守卫执行顺序为:组件后置守卫(from) => 全局前置守卫 => 独享守卫 => 组件前置守卫 => 全局后置守卫

 

 

   通过上述案例,可以总结出守卫执行流程,从 From 路由 切换为 To 路由时,执行顺序为:

    1.From 组件后置守卫

    2.全局前置守卫

    3.To 独享路由守卫

    4.To 组件前置守卫

    5. 全局后置守卫

两种路由模式

  Vue 中可以选择路由模式,分别为 hashRouter 和 historyRouter。

const router = new VueRouter({
  routes,
  // mode: "hash",默认为 "hash"
  mode: "history"    
})

  二者最大的不同就是 url 中是否有 #,对于url来说,#后为url的hash(参考URL API),在发送http请求时,不会保留。

  hashRouter 将路由路径与 url 用#分隔开,网页刷新时可以保持正常刷新。但因为url中#的存在,在某些校验中可能会导致不合法

  historyRouter 较为美观,但刷新网页时需要后端辅助,否则会出现 404

标签:vue,守卫,跳转,组件,router,path,路由
From: https://www.cnblogs.com/xt112233/p/17002875.html

相关文章

  • Vue之v-html指令
    v-html指令             1.作用:向指定节点中渲染包含html结构的内容。            2.与插值语法的区别:    ......
  • Vue过滤器
     过滤器         定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。        语法:         ......
  • Vue之v-text指令
    我们学过的指令:            v-bind :单向绑定解析表达式,可简写为:xxx            v-model:双向数据绑定 ......
  • Vue之表单元素
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>收集表单数据</title><scripttype="text/javascript"src="../js/vue.j......
  • Vue之set()方法
     可以在指定的对象里添加新的key值示例:<!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>Vue监测数据改变的原理</title>......
  • Docker+Jenkins+Gitee+Node+Vue构建dist包并通过publish over ssh传输到服务器替换重
    场景docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/12837......
  • Vue监测数据改变的原理
      <!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>更新时的一个问题</title><scripttype="text/javascript"src="........
  • Vue排序
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>列表排序</title><scripttype="text/javascript"src="../js/vue.js"><......
  • Vue之列表过滤
     示例:<!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>列表过滤</title><scripttype="text/javascript"src="../js/v......
  • 路由注解
    vue路由//默认没有菜单varisMenu=false//路由跳转前触发router.beforeEach((to,from,next)=>{//加载进度条开始NProgress.start()//去获取缓存中......