【发布时间】:2021-11-23 17:38:03
【问题描述】:
我在vue-router 4 中设置了一个route,它应该根据用户是否登录动态加载component。我是这样做的(可能有更好的方法?):
import Personal from '../views/Personal.vue';
import Public from '../views/Public.vue';
routes: [
{
path: '/',
component: async () => {
const isLoggedIn = await authenticateUser();
if (isLoggedIn == true) {
return Personal
} else {
return Public
}
}
}
]
App.vue 文件是这样的:
<template>
<div id="app">
<Site-Header></Site-Header>
<router-view></router-view>
<Site-Footer></Site-Footer>
</div>
</template>
问题在于,如果用户从主页路径以'/' 的路径登录,他不会离开该路径。相反,我希望 vue-router 只加载 Personal 组件。
Personal 和Public 之间的切换似乎只有在我用力刷新页面时才有效,否则不会发生任何变化。因此,如果用户登录,他们仍然会看到 Public.vue 组件,然后在页面刷新后他们会看到 Personal.vue 组件。如果他们随后注销,他们仍然会看到 Personal.vue 组件,直到他们刷新页面。
如何强制 vue-router 在登录/注销后分析路由并加载正确的组件?
【问题讨论】:
-
比动态组件(尤其是首先加载的根组件)更好的解决方案是结合使用router meta fields & route navigation guards
-
@Sensanaty 我不希望 URL 从
/更改为/personal。我希望在/的同一条路线上改变视图。 -
在这种情况下,您可以使用 named views 并使用
v-if<router-view v-if="loggedIn" name="Personal" /> <router-view v-else name="Public" />在两条路线之间简单地切换 -
@Sensanaty 这就是我在
routes[]部分中尝试做的事情,但由于路径没有改变,我没有重新加载路线。用更多代码更新了我的问题。 -
您误解了命名视图的工作原理。我制作了一个简单的示例here,您可以查看它,演示如何使用命名视图实现此目的。请注意,路由器
components的定义是复数,而不是单数。
标签: vue.js vue-router vuejs3 vue-router4