Vue.js 使用 VueRouter - 如何在用户刷新时正确路由

Vue.js with VueRouter - how to correctly route on user's refresh

我在我的项目中使用 Vue 和 VueRouter(还有 Vuex,但这里不是这种情况)。假设我有 5 个文件:

  1. main.js - 存储所有组件定义,从中导入它们 外部文件等。
  2. App.vue - 存储的主要成分 所有其他
  3. routes.js - 存储所有路由定义
  4. login.vue - 存储登录组件(登录页面)
  5. content.vue - 商店页面 组件

(非常简化的版本,但您一定明白)。

现在,如果我打开我的路径“/”,如果我没有登录,它应该将我重新路由到“/login”页面,而当我登录时,它应该将我重新路由到“/content”。这里没有什么特别的。 现在我的页面(几乎)按预期工作。如果我在浏览器中输入“/content”,它会尝试使用默认数据(即 userId = -1)呈现“/content”组件,然后立即将我重新路由到“/login”页面。 '/content' 只显示一秒钟。这是我的问题。我想重新路由到“/login”,而不提前使用默认数据呈现“/content”。

很明显,它试图呈现“/content”——可能来自缓存或其他东西,但由于重新路由是我在 created() 中的第一个命令,它不应该 在 app 组件中挂载 /content 组件,但是 /login.

知道如何预防吗? 我知道我没有附加任何代码,但我希望您不需要了解问题并提出任何解决方案建议,因为它需要削减和简化大量代码。

对于你的情况,我认为你应该使用 vue router 的 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 个关键字

除非 API 同时声明您不再通过身份验证,否则路由器将无法通过 beforeEach 方法自行刷新。

即使使用从 API 检索数据的循环方法,也会将它们作为反应数据存储在商店中。

在 Vue 中,一切都可以是响应式的,除了 Vue 路由器