Vue-router

1、路由配置

路由组件

路由组件就是一个普通组件,只不过不需要使用全局或者局部注册。在路由配置中绑定对应的路由组件即可

const page = {
  template: `
    <div></div>
  `
}


const routes = [
  {
    path: '/',
    component: page // 一旦页面路由匹配了 / 那么vue就会把page渲染到页面的router-view中
  }
]

路由配置

路由配置是一个数组

const routes = [
  // 多个路由配置对象
  {
    path: '/a/b/c/d/e', // 表示对应的路由路径
    component: 组件名,
    children: [
      // chilren中包含的也是路由配置对象,只不过他的组件会渲染到其父路由的组件中的router-view
      {
        path: 'f', // path不需要写 / 路由会和父路由进行拼接  /a/b/c/d/e/f
      }
    ]
  }, {
    path: '/a/b/c/d/e/f', // 这个和上面的情况不一样,他的组件会被渲染到app的router-view中
    component: 组件名
  }
]

创建router对象

router对象是new VueRouter得到的

const router = new VueRouter({
  routes,
  linkActiveClass: '新的类名',
  linkExactActiveClass: '精确的新的类名'
})

在new Vue中配置router

const app = new Vue({
  el: '#app',
  router // 一旦将router加入到这个位置,那么this中就会多两个东西,this.$route this.$router
})

router-link

router-link默认会被渲染成a标签

<router-link to="path"></router-link>

<!-- 修改单独的router-link激活类名 -->
<router-link active-class="类名"></router-link>

<!-- 修改单独的router-link精确激活类名 -->
<router-link exact-active-class="类名"></router-link>

<!-- 把active-class变成精确的class -->
<router-link exact></router-link>

<!-- 可以将router-link渲染成其他标签 -->
<router-link tag="标签名"></router-link>

<!-- 修改跳转方式的事件,默认是点击跳转 -->
<router-link event="click"></router-link>
<router-link :event="['click', 'mouseenter']"></router-link>

2、路由参数

路由参数分类

query

http://localhost:3000/#/?key=value&key2=value
  query

this.$route.query.key
this.$route.query.key2

router-link怎么声明

<router-link to="/?key=value"></router-link>
<router-link :to="'/?key=' + value"></router-link>
<router-link :to="{path: '路径', query: {key: value}}"></router-link>
<router-link :to="{name: '路由名字', query: {key: value}}"></router-link>

params

注意 想要有params参数必须配置动态路由,动态路由的变量,就是params的属性

const routes = [
  {
    path: '/:id'
  }
]
<div>{{$route.params.id}}</div>

router-link怎么声明

<router-link to="/value"></router-link>
<router-link :to="'/' + value"></router-link>
<!-- 下面写法需要给路由添加name属性才能完成 -->
<router-link :to="{name: '路由名字', params: {id: value}}"></router-link>

3、全局前置守卫

const router = new VueRouter()

router.beforeEach((to, from, next) => {
  // 判断某些路由是否需要登录才能访问
  if (to.matched.some(route => route.meta.自定义属性名)) {
    // 验证token是否可以使用
    if (验证token) {
      next() // 正常跳转
    } else {
      next({path: '/login', query: {url: to.path}}) // 跳转到登录页面后,会携带对应的url参数 这个url就是登录成功后要跳转的path
    }
  } else {
    next()
  }
})

export default {
  methods: {
    login () {
      // 获取用户名密码,用用户名密码请求登录接口
      如果请求成功,则将对应的token存储起来
      
      继续跳转到对应的页面

      const url = this.$route.query.url ||  '/'
      this.$router.replace(url)
    }
  }
}

4、 编程式导航

  • 声明式导航
  • 编程式导航

导航方式

编程式导航利用了router,这个router就是new VueRouter()。有些地方没法直接获取到router,需要使用this.$router

// 直接写path
this.$router.push('path')
// 直接写name
this.$router.push('name')
// 写成对象形式
this.$router.push({path: 'path'})
this.$router.push({name: 'name'})

// 携带query参数
this.$router.push({path: 'path', query: {key: "value"}})
this.$router.push({name: 'name', query: {key: "value"}})

// 携带params参数
this.$router.push({name: 'name', params: {key: "value"}})
// push的作用就是去跳转页面,并且会在历史记录里新增新的历史记录

/* 
  this.$router.replace()
    括号中的写法和push一致,replace会将新的页面替换当前历史记录中的页面

  this.$router.go() 去对应的历史记录中
  this.$router.forward() 历史记录前进
  this.$router.back() 历史记录后退
*/

5、 拦截器

请求拦截器

拦截请求,然后查询是否有token,如果有则添加到请求头(这样所有的请求就都有token),如果没有则不添加

// 添加一个请求拦截器
axios.interceptors.request.use((config) => {
  // 获取localStorage中的token如果有则添加,如果没有则不添加
  const token = localStorage.getItem('token')
  token ? config.headers.common['Authorization'] = "Bearer " + token : null
  return config
}, (err) => {
  return Promise.reject(err)
})

响应拦截器

拦截响应结果,如果为401,则跳转到登录,router在axios.js不存在,需要我们手动引入

// 添加一个响应拦截器
axios.interceptors.response.use((res) => {
  if (res.data.res_code === 401) {
    // 跳转到登录页
    router.push('/login')
  }
  // 对响应数据做点什么
  return res;
}, (error) => {
  // 对响应错误做点什么
  return Promise.reject(error);
});

token哪来的

token是在登录操作中获取到的,获取到token后,将其存储在storage里供以后使用

token在使用时需要加到header,并不是所有的都需要加Bearer前缀

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

推荐阅读更多精彩内容