首页 > 其他分享 >vue路由导航守卫

vue路由导航守卫

时间:2022-10-25 16:11:24浏览次数:60  
标签:vue next 守卫 调用 组件 router 路由

简单来说路由导航守卫就是.可以让我们对用户要跳转的路由做一次检查,符合条件的就放行,不符合条件则强制用户跳转至登录页面,说白了就时路由导航守卫是为了路由跳转之前做的检查及操作

 

1.全局前置守卫----router.beforeEach
router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
// to:要去哪个页面
// from:从哪里来
// next:它是一个函数。
// 如果直接放行 next()
// 如果要跳到其它页 next(其它页)
})

 


示例代码:

router.beforeEach(async(to, from, next) => {
NProgress.start() // 开启进度条
const token = store.state.user.token
const userId = store.state.user.userInfo.userId
console.log(token, to.path, from.path)
if (token) {
if (to.path === '/login') { // 有 token还要去login
next('/')
NProgress.done() // 关闭进度条
} else { // 有 token,去其他页面,放行
if (!userId) {
await store.dispatch('user/getUserInfo')
}
next()
}
} else {
if (to.path === '/login') { // 没有token,去login,放行
next()
} else {
next('/login') // 没有token,去其他页面
NProgress.done()
}
}
})

 

小结
router.beforeEach(回调(三个参数))
导航守卫函数中,一定要调用next( )
to.path: to是一个路由对象,path表示路径,是它的一个属性
2. 全局后置钩子----router.afterEach
router.afterEach 注册一个全局后置钩子:

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {
// ...
})

 


3. 全局解析守卫----router.beforeResolve
在 2.5.0+ 你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。

4.路由独享的守卫
你可以在路由配置上直接定义 beforeEnter 守卫:

const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})

 


5.组件内的守卫
beforeRouteEnter
beforeRouteUpdate (2.2 新增)
beforeRouteLeave

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`
}
}

 


完整的导航解析流程
导航被触发。
在失活的组件里调用 beforeRouteLeave 守卫。
调用全局的 beforeEach 守卫。
在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
在路由配置里调用 beforeEnter。
解析异步路由组件。
在被激活的组件里调用 beforeRouteEnter。
调用全局的 beforeResolve 守卫 (2.5+)。
导航被确认。
调用全局的 afterEach 钩子。
触发 DOM 更新。
调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

标签:vue,next,守卫,调用,组件,router,路由
From: https://www.cnblogs.com/vant-xie/p/16825226.html

相关文章

  • vue开发整理
    1.先检查项目是否有,接下来输入命令行:npminstall加载依赖包node_modulesnpminstall//下载依赖包命令2.如果安装失败请删除node_modulese文件夹,并清除缓存npm......
  • 01_初识Vue
    1.基础代码<!--html代码--><divid="root"><h1>hello,{{name.toUpperCase()}},{{address}}!</h1></div><!--js代码--><script>Vue.config.produ......
  • 网友心得—运行jeecgboot-vue3项目可能出现的问题
    运行jeecgboot-vue3项目可能出现的问题1.执行pnpminstall的时候报错ERR_PNPM_INVALID_OVERRIDE_SELECTOR Cannotparsethe"//"selectorintheoverrides​ 翻......
  • Vue之条件,列表渲染和事件处理的使用
    style和class<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="./js/vue.js"></script><style......
  • Vue常见面试题
    Vue常见面试题1、Vue的优点2、说说你对SPA单页面的理解,它的优缺点分别是什么?3、SPA首屏加载速度慢的怎么解决?4、Vue初始化过程中(newVue(options))都做了什么?5、对MVVM的理......
  • vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”
    错误示例截图解决方法修改shims-vue.d.ts中的内容declaremodule"*.vue"{ import{defineComponent}from"vue"; constComponent:ReturnType<typeofdefineC......
  • vue项目中使用axios获取本地json文件,报404错(已解决✔)
    vue项目中VueX的组件store里面有个actions的axiosget请求,请求本地的JSON文件的时候就报错404了。看了好久资料最终解决了。虽然刚开始的时候我已近把静态资源放在了pub......
  • vue使用canvas合成海报
    接着上面随笔,继续探索~~~上篇合成海报的过程有点负责冗余。完全可以不借助插件,用canvas合成~~需求背景:多张模版可供选择,用户输入姓名,上传头像,最终合成海报保存分享。1.头像有......
  • Flutter(八):Flutter路由管理(Router)
    目录一、术语路由(route):导航(Navigator):二、路由管理1、Navigator示例代码2、路由定义(命名路由)在App中定义router:3、Navigator方法介绍1.Navigator.push2.Navigor.pop......
  • vue3 更改编译端口号
    在package.json文件中修改scripts"scripts":{"serve":"vue-cli-serviceserve--port80","build":"vue-cli-servicebuild","lint":"vue-cli-s......