Vue-router进阶篇

前言

上一篇我们学习了vue-router的基础,包括基础标签和基础配置,这一篇文章,我们将会来学习路由的几个高级特性。让我们开始吧。



路由守卫

路由守卫是由多个检测函数和钩子函数组成的一连串的自定义逻辑。

全局守卫设置:

  1. beforeEach (to, from, next) : router.js之中设置的全局拦截守卫,从名字可以看出,每一次路由的变化实际上都会经过一次这个函数内容,to表示的是变化后的路由对象,from表示的是来自于哪一个路由对象内容,next是一个函数内容,可以传递相关的跳转值,或者直接调用,会跳转到指定的目标路径下面。所以我们在是用的时候一定要记得next的调用。

我们来看一段代码:

import Vue from 'vue'
import Router from 'vue-router'
import router from './router'

Vue.use(Router)

const route = new Router({
  ...router
})

const logging = false;

route.beforeEach((to, from, next) => {
  if( to.name !== "logging" ){
    if( !logging ) next( { name: 'logging' } )
    else next();
  }
  else {
    if( logging ) next( { name: 'home' } )
    else next();
  }
})

export default route

复制代码

这是一段设置登陆过滤的代码,只是简单的模拟一下。当没有登陆的时候将会跳转到名称为logging的界面,当登陆了之后如果是需要跳转登陆界面则转换当前跳转路径到home页面,否则则直接跳转。

  1. afterEach(to, from):这个方法是在跳转完成之后执行的钩子函数内容,并且所有的路由跳转全部都会调用这一钩子,但是由于是跳转完成之后才触发,所以并不影响跳转结果,因此只有两个参数。

代码伺候:

route.afterEach((to, from) => {
  console.log(to);
  console.log(from);
  console.log(arguments);
  console.log("afterEach");
})
复制代码
  1. beforeResolve(to, from, next) :全局解析守卫,在所有的组建内守卫和异步守卫执行完毕之后才会执行,但是会在展示页面渲染完成之前执行,所以是可以修改跳转方向的(注意有next函数内容),书写方式类似于beforeEach,这里就不再书写了,可以自己尝试一下。

路由守卫设置:

  1. beforeEnter(to, from, next):路由独享守卫,书写在routes属性的数据项对象之中,当跳转到当前路径的时候,会自动的调用这一守卫函数。和beforeEach的区别只是在于,一个是全局的,一个是单个对象的,当然执行顺序也是会有差别,之后会同一说明。

代码伺候:

routes: [
    {
        path: '/',
        name: 'home',
        component: Home,
        beforeEnter: (to, from, next) => {
            console.log('this is beforeEnter');
            next();
        }
    }
]
复制代码

组件守卫设置:

  1. beforeRouteEnter(to, from, next):组建内路由守卫函数,编写在组建之中,是专门对于组件逻辑的一道关卡。这一守卫在路由还没有渲染提交前就已经执行,所以我们在这一守卫之中是没有办法调用this变量的,因为这个时候还不存在this变量内容。但是如果实在是需要使用当前的vue实例对象,可以向next方法之中传递一个方法内容。在后面的守卫执行顺序之中我们可以发现,实际上beforeRouteUpdate会在beforeRouteEnter之后才运行,那么为什么服用组件的enter守卫this也不可用呢。个人觉的是为了于激活新组件保持队形。

我们来看一段代码:

beforeRouteEnter(to, from, next){
    console.log('this is before route enter');
    next(vm => {
        console.log(vm); //vm就是当前组件的实例
    });
},
复制代码
  1. beforeRouteUpdate(to, from, next):这一守卫是当路由发生变化,组件被复用的时候调用的。所以我们可以知道,首次进入组建的时候是不会调用这一守卫的,只有当复用发生的时候才会调用。同时这一函数之中可以调用this,因为当前组件对象已经被渲染了。

  2. beforeRouteLeave(to, from, next):这一守卫会在当前组件即将离开的时候进行调用,我们常常在页面离开的时候获得一些是否要离开当前界面的确认框,就可以通过这一守卫进行实现。同时这一守卫之中也是可以调用this的。

我们综合上面三个守卫来一段代码:

beforeRouteEnter(to, from, next){
    console.log('this is before route enter');
    next(vm => {
        console.log(vm);
    });
},

beforeRouteUpdate(to, from, next){
    console.log('this is before route update');
    next();
},

beforeRouteLeave(to, from, next){
    var confirm = confirm("是否离开当前页面?");
    if(confirm){
        console.log('this is before route Leave');
        next();
    }
    else {
        next(false);
    }
}
复制代码

最后我们来总结一下守卫的调用过程吧。

  1. 路由改变触发。
  2. 确定离开当前组件时,调用beforeRouteLeave守卫,然后组件失活。
  3. 如有设置,调用全局的beforeEach守卫。
  4. 如此处跳转的组件为重用组件则调用重用组件之中的beforeRouteUpdate守卫。
  5. 针对跳转的路由,调用路由独享的守卫beforeEnter。
  6. 解析异步路由组件。 (import引入当前展示组件。)
  7. 在被激活的组件之中调用beforeRouteEnter。(复用组建重新激活,新组件需读取解析)
  8. 调用全局的解析守卫 beforeResolve。
  9. 导航被确认。
  10. 调用全局的钩子函数afterEach。
  11. 触发dom更新。
  12. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。


路由动态效果

通过使用< transition >标签来进行动效,基础篇我们有说过router-view这个功能标签是可以使用动效标签包裹,并且可以使用keep-alive标签的,这里我们来尝试一个简单的动效吧。 上代码:

html代码:
<transition-group name="change">
    <router-view key="default"/>
    <router-view key="child2" name="child2"/>
</transition-group>

style代码:
.change-enter{
    opacity: 0
  }

  .change-enter-active{
    transition: opacity 1s ease;
  }

  .change-enter-to{
    opacity: 1;
  }

  .change-leave{
    opacity: 1
  }

  .change-leave-active{
    transition: opacity 1s ease;
  }

  .change-leave-to{
    opacity: 0;
  }
复制代码

这样我们就简单实现了一个隐出隐现的效果。



总结

本文主要是说明了路由守卫的功能和使用,同时捎带提及了过度动画内容。路由的全部概念和用法可以说就此全部提及完毕。之后关于vue-router的内容只剩下源码阅读,和一些开发时候的问题总结,我会努力持续更新,希望看官们能满意。有什么错误的地方也请帮忙告知,我也会即使修改过来的。欢迎大家一起学习讨论

转载于:https://juejin.im/post/5cd21864e51d453b440236e5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值