完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave
守卫。 - 调用全局的
beforeEach
守卫。 - 在重用的组件里调用
beforeRouteUpdate
守卫 (2.2+)。 - 在路由配置里调用
beforeEnter
。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter
。 - 调用全局的
beforeResolve
守卫 (2.5+)。 - 导航被确认。
- 调用全局的
afterEach
钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter
守卫中传给next
的回调函数,创建好的组件实例会作为回调函数的参数传入。
vue-router如何做历史返回提示?
获取vue-router的上一个页面是否存在或者是否是自己需要返回的地址,可以使用vue-router的的声明周期函数,有三种模式:
第一种、使用全局函数beforeEach,直接来获取form.path(即为对应的上一次地址的路由path内容);
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
第二种、使用组内共享函数beforeEnter,直接来获取form.path(即为对应的上一次地址的路由path内容);
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
第三种、使用组件内函数,beforeRouteEnter,,直接来获取form.path(即为对应的上一次地址的路由path内容);
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`
}
}
vue-router如何做用户登录权限等?
原理
用vue-router来控制用户登录权限的原理,实际上就是应用了vue-router提供的router.beforeEach来注册一个全局钩子。具体用法
根据判断是否具有登录权限来设置路由跳转,如果没有全选统一跳转到登录页面。
第一步:新建一个名字为permission的js文件,代码如下
import router from './router'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
router.beforeEach((to, from, next) => {
NProgress.start(); // 开启Progress
if (sessionStorage.getItem('accessToken')) {
next()
} else {
if (to.path ==="/login"|| to.path ==='/register'){
next()
}else {
next('/login')
}
NProgress.done()
}
});
router.afterEach(() => {
NProgress.done() // 结束Progress
});
在mian.js中导入permission.js,代码如下:
import './permission' // 权限