VUE 路由守卫+组件守卫

1.全局前置守卫beforEach(写在main.js 或router.js添加)

守卫方法接收三个参数:

  • to:即将要进入的目标路由对象
  • from:当前导航正要离开的路由
  • next:执行下一步
const router = new VueRouter({
    routes
})

router.beforeEach((to, from, next) => {
    // to将要访问的路径
    // from代表从哪个路径跳转而来
    // next 是一个函数,表示放行
    // next() 放行, next('/login')强制跳转
    if (to.path === '/login') return next();
    const tokenStr = window.sessionStorage.getItem('token');  //判断是否存在token
    if (!tokenStr) return next('/login');
    next();
});
export default router

注意:

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中

每个守卫方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象

  • from: Route: 当前导航正要离开的路由

  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

    • next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

    • next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

    • next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: truename: 'home' 之类的选项以及任何用在 router-linkto proprouter.push 中的选项。

    • next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

2.全局后置钩子afterEach

  • beforeEach是路由跳转前执行的,afterEach是路由跳转后执行的。
router.afterEach((to,from)=>{
  if(to.path === "/news"){
    alert("进来news了哦");
  }
})

3.路由独享的守卫beforeEnter

  • 在路由配置上直接定义 beforeEnter 守卫
import Vue from 'vue'
import Router from 'vue-router'
 
Vue.use(Router)
import Home from '../../view/Home.vue'
import Test from '../../view/Test.vue'
import News from '../../view/News.vue'
export default new Router({
  routes: [
    {
      name:"Home",
      path:"/",
      component:Home,
    },
    {
      name:"Test",
      path:"/test",
      component:Test,
      beforeEnter(to,from,next){
        if(to.path==="/test"){
          alert("请登录");
          next(false); // 禁止跳转
        }else{
          next()
        }
      }
    },
    {
      name:"News",
      path:"/news",
      component:News
    },
    {
      redirect:"/",
      path:"*",
    }
  ],
  mode:"history"
})

4.组件内的守卫

  • 它是和data,methods平级的。
  • to:即将要进入的目标路由;
  • from:当前导航正要离开的路由,from.name 是路由的名称,对应路由配置中的 name;
  • next:一个用来 resolve 当前钩子的方法,需要调用该方法来确认或者中断导航;

beforeRouteLeave(to, from, next) {
   // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
    next()
},

beforeRouteEnter(to, from, next) {
 // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
    next()
},

beforeRouteUpdate(to, from, next) {
   // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    next()
},
data:{},
method: {}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。