vue.js - 带有 VueRouter 的 Vue.js - 如何在用户刷新时正确路由
问题描述
我在我的项目中使用 Vue 和 VueRouter(还有 Vuex,但这里不是这种情况)。想象一下我有 5 个文件:
- main.js - 存储所有组件定义,从外部文件导入它们等等。
- App.vue - 它是存储所有其他的主要组件
- routes.js - 存储所有路由定义
- login.vue - 存储登录组件(登录页面)
- content.vue - 存储页面组件
(相当简化的版本,但你肯定明白)。
现在,如果我打开路径“/”,如果我未登录,它应该将我重新路由到“/登录”页面,并在我登录时重新路由到“/内容”。这里没什么特别的。现在我的页面按预期工作(几乎)。如果我在浏览器中输入“/content”,它会尝试使用默认数据(即 userId = -1)呈现“/content”组件,然后立即将我重新路由到“/login”页面。'/content' 只显示一秒钟。这是我的问题。我想重新路由到 '/login' 而不提前使用默认数据渲染 '/content'。
很明显,它试图渲染“/content”——可能来自缓存或其他东西,但由于重新路由是我在 created() 中的第一个命令,它不应该在应用程序组件中安装 /content 组件,而是 /login。
知道如何预防吗?我知道我没有附加任何代码,但我希望你不需要理解问题并建议任何解决方案,因为它需要削减和简化大量代码。
解决方案
在你的情况下,我认为你应该使用 vue 路由器的 beforeEach 钩子。可以在router中使用meta字段来指示路径是否需要认证,并在beforeEach函数中进行处理。
我将给出示例代码。
import Router from 'vue-router';
const router = new Router({
routes: [{
path: '/content',
meta: {
auth: true,
}
}, {
path: '/login',
}]
});
router.beforeEach(async (to, from, next) => {
if (to.matched.some(m => m.meta.auth)) {
// user your authentication function
const isAuth = await getAuthentication;
if (!isAuth) {
next('/login');
}
next();
}
})
如果您的身份验证功能不是异步功能,则应删除 async/await 关键字
推荐阅读
- c# - 获取“索引超出了数组的范围。” 在 C# 中使用 foreach 循环时
- html - 从 HTML 中的按钮单击访问 URL
- python - 模块“tensorflow_core._api.v2.train”没有属性“GradientDescentOptimizer”和“Tensor”对象在 python 上的 Tensorflow 2.0 中不可调用
- html - 消除列表项和导航顶部之间的间隙
- git - 获取 git LFS 文件时出错:服务器上不存在对象:[404] 服务器上不存在对象
- python - 如何完全删除 Python 及其所有库
- node.js - 猫鼬查询按日期分组
- python - Python:权重转换脚本问题
- php - 如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?
- python - 属性只能在嵌套的 for 循环中更新一次