Vue Router学习

Vue Router学习

本文插图引用bilibili coderwhy 老师的资料

一、认识路由

路由:就是通过互联网,把信息从源地址传输到目标地址的活动

路由的两种机制:路由和转送

路由中有个叫做路由表的东西,路由表对网络中的资源进行了映射,根据请求的url,路由会将数据转送到相对应的目标地址。

二、什么是前端渲染,什么是后端渲染

在早期的时候,早到js还没出现的时候,那时候的html+css页面是在服务器已经渲染好了,就是通过jsp或者是PHP或是其它的一些技术把从数据库中请求到的数据已经把网页给渲染完成之后直接推送给浏览器的,这就是后端渲染。这种模式有着非常大的缺点,前后端的责任不够清晰,后端人员需要写一些html代码进行页面的渲染,而前端很多人员又不会java等后端开发的语言,而且通过Jsp开发出来的页面维护起来也是非常麻烦的,里面html杂糅着java代码。

到了ajax请求出现之后,网站开始出现了前后端分离的模式,后端只负责提供需要进行可视化的数据,不再负责任何页面的内容。而前端则负责面对api接口发送ajax请求,拿到数据后通过编写js代码创建一些DOM元素来进行数据的展示,这就是前端渲染。其实我之前开发的网站大部分是这种前后端分离的模式的,就是底层使用jQuery向服务器发送ajax请求,然后动态的创建一些东西再append到页面中,但是那时候我还是使用了jsp,不过只是根据用户类别进行某些东西是否展示而已。其实已经很接近前后端分离了。


前后端分离.png

三、什么是前端路由,什么是后端路由

像是之前开发使用的Tomcat服务器,它会解析请求信息的URL,然后看这个request是请求的哪个资源,在后端的资源都会被Tomcat服务器的后端路由使用一个映射表来映射,然后将这个对应的资源给返回。

前端路由也是差不多的思想,根据URL,然后显示这个URL匹配的资源,但是在URL改变的时候不进行整体的刷新。


前端路由.png
前端路由.png

四、改变URL的方式

  • URL的hash

    可以通过URL的hash锚点(#),可以改变URL但是页面不会刷新

    hash.png

当你通过location.hash输入一个东西后,location.href会变成

原先的内容+#+你输入的内容

  • HTML的history模式

  • history接口时HTML5新增的,它有五种模式改变URL而不刷新页面


    history.png

五、vue-router-安装和配置方式

六、路由映射配置呈现出来

七、路由的默认值和修改为history模式

八、router-link的其它属性的补充

九、通过代码跳转路由

十、vue-router-打包文件的解析

十一、vue-router-路由懒加载的使用

十二、路由的嵌套使用

十三、参数传递的两种方式

十四、vue-router中router和route的由来

通过源码来分析

Vue.use(router)安装router插件的时候默认会去调用插件的install方法

export function install (Vue) {
    ...
    //Vue是传入的Vue实例对象
    Vue.mixin({
    beforeCreate () {
        //isDef(this.$options.router)判断Vue实例对象中是否有router属性
      if (isDef(this.$options.router)) {
          //有的话就把这个Vue实例对象给赋值给这个Vue实例对象中的_routerRoot属性
        this._routerRoot = this
          //把这个实例对象的Options中的router赋值给这个实例对象的_router属性
        this._router = this.$options.router
        this._router.init(this)
        Vue.util.defineReactive(this, '_route', this._router.history.current)
      } else {
        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
      }
      registerInstance(this, this)
    },
    destroyed () {
      registerInstance(this)
    }
  })
 Object.defineProperty(Vue.prototype, '$router', {
     //所以this._routerRoot._router就是Vue实例对象中的options里的router
    get () { return this._routerRoot._router }
  })
    //而route是指的动态获取的当前活跃的路由
  Object.defineProperty(Vue.prototype, '$route', {
    get () { return this._routerRoot._route }
  })   
    ...
}

Object.defineProperty方法可以给某个对象添加属性,语法格式Object.defineProperty(需要添加属性的对象,属性名,属性值)

//在install方法中还有这两行代码,就是注册全局组件
//router-view和router-link
Vue.component('RouterView', View)
  Vue.component('RouterLink', Link)

十五、全局导航守卫

如果想要在跳转某个路由的时候做些事情,比如说,当首页路由活跃的时候,网站标题document.title显示为首页,就是在浏览哪个页面的时候都显示那个页面的title。

就是监听路由的跳转,使用的是router.beforeEach函数,这个函数需要传一个函数作为参数,这个函数中有三个参数,to目标路由,from当前路由,next函数。next函数表示跳转,只有执行了这个函数才会跳转。

beforEach函数

beforeEach(guard: NavigationGuard): Function
/******************************************/
export type NavigationGuard < V extends Vue = Vue > = (
  to: Route,//to是目标路由
  from: Route,//当前路由
  next: (to?: RawLocation | false | ((vm: V) => any) | void) => void
) => any
router.beforeEach((to,from,next)=>{
  document.title = to.matched[0].meta.title;
  next();//不使用就不会跳转
});

因为我们想要根据路由来改变网页标题,所以路由需要保存一些数据。路由如果需要保存数据,则在路由定义的时候添加一个meta属性,meta表示元数据,描述数据的数据。然后在这个meta属性中添加属性名属性值。

{
    path:"/home",
    component:Home,
    //保存数据
    meta:{
      title:'首页'
    },
  }

注意:在使用嵌套路由的时候,直接to.meta是获得不到这个路由的meta数据的,可以通过matched属性的第一个元素的meta属性拿到meta数据,因为使用了嵌套路由,这个路由的meta是undefined.

十六、这里记住一个查看源码很好的一个快捷键,就是Ctrl+单击,会进入这个函数或者这个类中。以前竟然不知道这个这么好用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 那这次呢?我决定直接就先放一个小小demo上来 其实我们在引入vue-router插件那一刻,我们的网页就已经附带...
    看物看雾阅读 821评论 0 1
  • 什么是路由? vue-router这里的路由就是SPA(单页应用)的路径管理器。通俗的说,vue-router就是...
    晏子小七阅读 927评论 0 2
  • 学习目的 学习Vue的必备技能,必须 熟练使用 Vue-router,能够在实际项目中运用。 Vue-rout...
    _1633_阅读 92,124评论 3 58
  • vue-router学习笔记 安装 并且如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功...
    EL_PSY_CONGROO阅读 586评论 0 0
  • 用vue-cli3创建vue项目,可以在创建时让脚手架安装好vue-router,但这里我不这么做,本着学习rou...
    温酒居士阅读 257评论 0 3