vue-router

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

上面是vue-router官方的介绍,接下来我总结一下,自己平时用的vue-router的相关知识,适合入门级别的小白白们,高手请绕(饶)过


在使用vue-router之前,我们首先要把他整合到vue脚手架中,

(注意:本文的讲解基础是已经默认你安装好了vue-cli那一套东西)

vue-router 安装
npm install vue-router --save

src/router/index.js文件下写入以下代码

import Vue from 'vue'
import VueRouter from 'vue-router'

//在vue中注册VueRouter
Vue.use(VueRouter);

//导入路由映射的组件

//普通导入方式
import  comA  from '@components/comA'

//需要懒加载的导入方式(所谓懒加载就是说,一开始不会加载所有的资源导致等待时间太长,而是当你切换导航的时候,相关组件里面的资源会陆续加载)
const comB = resolve=>require(['@components/comB'],resolve);



//然后写出路由映射关系

const routes = [
    {
      path:'/',
      name:'home',
      component:home,
    },
    {
      path:'/about',
      name:'about',
      component:about,
      children:[
        {
            path:'aboutA' //其实相当于 path:'/about/aboutA'
        },{
            path:'aboutB',
        }
      ]
    }
]

这就是比较简单和比较全的结构了,除去(参数和钩子,后面讲)。
写完映射关系,然后创建router实例,并且吧映射关系传进去

    
    const router = new VueRouter({
        routes
    })
    
    //需要注意的是,全局路由钩子就是要写在router实例上的,如下
    
    router.beforeEach((to, from, next)=>{
        ...
        next();
    })

接下来,我们来看看vue-router的模式

vue-router默认使用的是hash模式,就是在路由跳转的时候,会有很多 #,看起来不太美观,因此我们可以使用 history模式 ,这种模式充分利用了 history.pushStateAPI来完成URL跳转而无需重新加载页面,从而提高了用户体验。但是,当你直接访问 www.root.com/home/page1的时候,浏览器就会真的去请求该地址,如果后端没有相关的配置,那么就会返回404,就很尴尬了,所以一定要和后端配合好。

模式基本的样子就是下面的样子

    const router = new VueRouter({
        mode:"history",
        routes
    })

路由传参

一般路由有两种传参方式,分为 paramsquery,先看看params吧,就用官网的例子吧

const User = {
  template: '<div>{{$route.params.id}}</div>'
}

const router = new VueRouter({
  routes: [
    // 动态路径参数 以冒号开头
    { path: '/user/:id', component: User }
  ]
})

在组件内使用$route会使 组件与之高度耦合,从而组件只能在特定的URL上使用,他的灵活性受到了限制,因此可以使用props使他们解耦,


const User = {
    props:['id'],
    template:`<div>{{id}}</div>`
}

const router = new VueRouter({
    routes:[
        {
            path:'/user/:id',
            component:User,
            props:true
        },
        
        //对于包含命名视图的路由,你必须分别为每一个命名路由添加 props 选项,如下
        {
            path:'/user/:id',
            components:{default:User,sidebar:SideBar},
            props:{default:true,sidebar:false}
        }
    ]
})

这样一来就极大的增加了组件的灵活性,更加易于重用和测试

params 和 query

query是这样用的

    
    //传参
    this.$router.push({
        name:'home',
        query:{
            id:id
        }
    })
    
    //接受参数
    
    this.route.query.id
    

params和query十分相似,

    
    //传参
    this.$router.push({
        name:'home',
        params:{
            id:id
        }
    })
    
    //接受参数
    
    this.route.params.id
    

这里有一点是需要注意的,那就是使用 params的时候,是不可以使用path的,因为params本身就是path动态路径的构成元素,这样会发生矛盾。

为了保持一致性,query 和 params传参的时候,都尽量 使用nama来进行区分。


参数的位置
一般情况下 this.$router.pushrouter-link里面的to的参数类型是一模一样的。如下


    <router-link to:"/home"></router-link>
    //相当于
    
    this.$router.push("/home");
    
    {
        name:"home",
        path:'/home/:id',
        componet:Home
    }
    
    <router-link to:"{name:"home",params:{id:"lala"}}"
    //相当于
    this.$router.push({
        name:"home",
        params:{
            id:"lala"
        }
        
    })

以上就是 tothis.$router.push参数一直的说明,接下来 我们就 系统的看一下,路由钩子;

路由钩子

全局路由钩子

beforeEach and afterEach


    const router = new VueRouter({
        ...
    })
    //需要注意的是,全局路由钩子,是路由实例上的,也就是上面的那个 router上的,不要弄混哦
    
    router.beforeEach((to, from, next)=>{
        // to 将要到达的路由对象
        // from 目标路由对象
        // next()进行下一步
        // next(false) 中断当前的跳转,一般用于 提醒用户是否确认进入某页面,用户取消
        //next('/') 或者 next({name:"home",params:{}})
    })    
    
    router.afterEach((to,from)=>{
        ...
        //导航已经结束,因此没有next
    })
    

路由映射关系上的 钩子

beforeEnter and afterEnter

  const router = new VueRouter({
      routes:[
        {   name:home,
            path:'/home',
            component:Home,
            beforeEnter:(to,from, next) =>{
                ...
            },
            afterEnter:(to, from)=>{
                ...
            }
        }
      ]
  })

基本上和全局路由钩子的用法一样

组件内的钩子

beforeRouterEnter and beforeRouterUpdate(2.2 add) and beforeRouterLeave

    
    export default{
        data(){
            return {
                ...
            }
        },
        beforeRouterEnter (to, from, next){
            //由于在使用这之前,导航还未确认,实例还没有被创建,所以这里面是不能调用this的
        },
        beforeRouterUpdate(to,from,next){
            //次函数的触发规则是,在类似 /home/:id 这样的动态路由中,由于id的变化,但是组件仍然不变的情况下,便可以使用
            //此时实例已经创建完成,因此,this可以登上舞台
            
        },
        beforeRouterLeave(to,from,next){
            //导航离开组件对应路由会触发这个函数
            //可以访问this
        }
    }
        


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