javascript - 如何在 beforeRouterEnter 保护中调用 next()
问题描述
我已经在这个问题上停留了几个小时。我正在使用 Vue3
我正在尝试使用beforeRouterEnter
警卫来检查当前登录的用户角色,并基于此重定向用户以适当的路线。
提交登录表单(来自登录页面)后,userRoleId
存储在 vuex 中,我被重定向到主页。主页有以下脚本:
beforeRouteEnter(to, from, next) {
next((vm) => {
if (vm.$store.getters.userRoleId == USER) {
next("/us");
return;
}
if (vm.$store.getters.userRoleId == ADMIN) {
next("/ad");
return;
}
if (vm.$store.getters.userRoleId == SUPER_ADMIN) {;
next("/sa");
return;
}
next();
});
},
我不断收到以下警告:从“/”到“/”时,在一个导航守卫中不止一次调用了“下一个”回调。它应该在每个导航守卫中准确调用一次。这将在生产中失败。
错误出现在以下情况:我没有登录并被移动到 else 块(一旦 next()
到达该行),或者当我登录并从内部 whieverif
声明为真时,一旦next()
到达 - 导致重新- 直接不工作。
解决方案
next
在回调内部调用是错误的next
。此时导航已经完成,这应该是一个重定向,router.push
而这种逻辑属于组件mounted
(next
回调在它之后运行)而不是路由器守卫。
这里不应该有重定向,因为它们是不必要的。store 是全局的,可以直接导入而不是在vm
.
它应该是:
import store from '...';
...
beforeRouteEnter(to, from, next) {
if (store.getters.userRoleId == USER) {
next("/us");
} else if ... {
...
} else {
next();
}
},
推荐阅读
- python - 在函数中打印返回值,Python
- c# - 如何使用asp.net通过gridview中的复选框删除多条记录
- javascript - 如何使用基本代码找到三角形的面积,例如:
- php - 如何使用 Laravel 默认重置密码链接附加电子邮件
- philips-hue - 来自 philips-hue 桥的“未经授权的用户”响应
- ios - iOS Twin Push SDK Lib showNotification 未触发
- sparql - DBpedia 中等效的 Wikidata 查询
- angular - 如何连接两种形式(一种是另一个内的数组)
- powershell - 在 Active Directory 中按真实姓名查找用户
- c++ - c ++,将任何类型(模板T)的数据打印到控制台