路由的详解及vue-router模块实例

演示项目源码

  • 什么是路由?

1、后端路由:早期会通过解析不同的URL,服务器找到对应的资源,并渲染成页面,最后将对应的页面返回给客户端直接展示。
2、前端路由:前后端分离后,可以先通过静态资源服务器拿到HTML+CSS+JS文件,然后在进入不同页面的时候使用Ajax获取API服务器上的数据资源,这样最大的优点就是前后端责任清晰,后端专注于数据,前端专注于可视化,服务器压力也比较小。
3、前端路由/SPA:
a、首先,对于单页面应用程序整个项目只有一个HTML,用户一开始就获取整个项目静态资源。
b、SPA是在前端路由的基础上又增加了一层前端路由,通过监测href的数据来切换不同的组件,切换到的组件发起Ajax请求,最后在API服务器上拿到数据资源,看起来就像进入了新页面一样。
c、vue-router是通过hash来修改href并可以做到不刷新页面。(href是一个栈储存,先进后出)
备注:URL:
协议:// 主机:端口/路径?查询#哈希
scheme:// host:port/path?query#fragment

location.hash = '/home'
history.pushState({},'','/home') // HTML提供的方法
history.go(-1) // 复数后退,正数为前进,数字带表步数
  • 具体的使用方法:
// 安装vue-router,并新建文件夹router->index.js
npm install vue-router --save 

在index.js中配置路由项

import Vue from 'vue'
import VueRouter from 'vue-router'
import about from '@/components/about'
import home from '@/components/home'

use(VueRouter) // 安装注入插件
routes = [
  {
    path: '/',
    name: 'home',
    component: home,
    redirect: '/home' // 重定向
    meta: {   // 元数据(描述数据的数据)
        title: '首页'
    },
    beforeEach: (to, form, next) => {}, // 路由独享守卫
    children: [  // 嵌套子路由
        {
          path: '/',
          component: isMessage
        },
        {
          path: 'isMessage',
          component: isMessage
        },
        {
          path: 'isNew',
          component: isNew
        }
      ]
  },
  {
    path: '/about/:aboutId', // 动态绑定路由
    component: about,
    meta: {
        title: '关于'
      },
  },
  {
    path: '/shopList',
    component: shopList,
    meta: {
    title: '商品',
    
   },
 }
]
// 创建router实例
const router = new VueRouter({
  routes
})
// 前置守卫(guard)
router.beforeEach((to, form, next) => {
  window.document.title = to.matched[0].meta.title // 修改每个页面的标题
  next() // 必须调用,否则不生效
})
// 后置钩子(hook)
router.afterEach((to, form) => {
  console.log(to) 
})
export default router // 导出实例

挂载到vue实例

// 在main.js中
import router from './router' // 导入
new Vue({
  el: ''#app',
  router,
  render: h => h(App) 
})

路由跳转

<router-link to="/home" tag="button" replace>按钮</router-link>
// tag指定渲染成什么样的标签,replace不会在history中留下记录,无法回退
this.$router.push('/home')
this.$router.replace('/home') // 无痕浏览
this.$router.go('/home') // 接受一个整数作为参数,在 history 记录中向前后多少步
<router-link :to="'/about/'+aboutData" tag="button">关于</router-link>
// 动态页面的跳转aboutData在data中定义
<h3>{{$route.params.aboutId}}</h3>
 // 在about页面中用可以拿到在动态的URL
<keep-alive exclude='about'>  
// exclude排除某个路由不缓存,include为缓存,使用页面name属性标记,多个状态用逗号且不能使用空格
// 路由来回跳转时,保持页面不更新
  <router-view/>
</keep-alive>
activated () { // 活跃状态执行函数
  this.$router.push(this.path) // 在活跃状态的时候直接进入到需要展示的路由 
},
deactivated() { // 非活跃状态执行函数
  console.log('deactivated')   
},
// 以上两个函数必须适应keep-alive才会有效
beforeRouteLeave (to, from, next) {
  this.path = this.$route.path // 离开页面的时候记录下用户选择的路由
  next()
}

嵌套路由

<router-link to='/home/isMessage'>消息</router-link>
<router-link to='/home/isNew'>新闻</router-link>
<router-view/>

路由的懒加载:js的静态资源按组件分包,用到时再发送请求

// import about from '@/components/about'
// import home from '@/components/home'
const about = () => import('@/components/about')
const home = () => import('@/components/home')

路由传参

<router-link :to="{path:'/shopList',query:{userId: '9527'}}" tag="button"></router-link> // 传参
<h3>{{$route.query.userId}}</h3> // 接收参数
// 函数跳转
<button @click="listClick">商品</button>
listClick () {
 this.$router.push({
   path: '/shopList',
   query: {
   name: 'word'
   }
 })}
<h3>{{$route.query.name}}</h3> // 接收参数

组件内守卫

const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容