router导航守卫,全局与组件中的使用

发布于 2020-01-03  89 次阅读


1、安装vue-router

npm install vue-router

2、在需要使用组件引入

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

3、router.beforeEach全局守卫

判断是否存在token值,如果存在就继续执行,如果不存在就跳转到指定页面,适用场景如用户点击购物车如果没有登录则自动跳转到登录页面等。。。

router.beforeEach((to,from,next)=>{
  if(to.path==='/user') {
      
    let token = localStorage.getItem("x-auth-token");
    if(token){
​
      next()
    }else{
        alert(123)
      // next('/user')
      //给出提示
      let obj = {content:"请先登录",icon:"info"}
​
      Store.dispatch("toastAsync",obj)
    }
​
    return
    
  }
  else{
    //其他页面不守卫
    next();
  }
​
})
​
​

4.解决from和to的报错(重复路由跳转详情页)

当重复路由跳转详情页的时候会发生报错,

解决方法

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}

如果还是报错的化,则需要使用路由降级

**meta是路由元信息

5、组件内使用场景

依然依赖上面的router文件

// js部分 // 随便你写点啥,头尾就先省略吧~

<script>
export default {
  data () {
    return {
      // 内容就省啦~重点往下看
    }
  },
  beforeRouteEnter: (to, from, next) => {
    // 组件内守卫
    next(vm => {
      // judge login
      let token = window.localStorage.getItem('token')
      if (to.meta.requireLogin && to.meta.requireLogin === 1) {
        if (token) {
          next()
        } else {
        // 不满足条件就要去进行登录操作
          next('/login')
        }
      } else if (to.meta.requireLogin && to.meta.requireLogin === 2) {
        if (token) {
          next('/')
        } else {
          next()
        }
      } else {
        next()
      }
    })
  }
}
</script>

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。