我有一个App.vue
组件,我想加载当前登录的用户。我还想在用户尝试进入登录路线时重定向用户,并且当前登录的用户已经保存在上下文中(他已经登录)。
// inside App.vue component
created() {
AuthService.getCurrentUser().then((user) => {
this.user = user;
});
}
我检查登录组件的created
方法是否设置了currentUser,但是当用户尝试转到登录页面时,可能是当前用户的请求还没完。
我的问题是:
如何在App.vue组件加载之前等待数据加载? 我看到这样的事情:
waitForData: true,
data(transition) {
return AuthService.getCurrentUser().then(currentUser => {
transition.next({ currentUser });
});
}
实际上并没有等待加载数据并且组件仍然加载。
修改:我了解beforeRouteEnter
,但这是App.vue
组件,它是所有组件的父组件,而不是特定于路由的组件。
答案 0 :(得分:6)
我遇到了一个非常类似的问题,并通过在包含依赖于加载数据的子组件的元素上添加 v-if 来解决。然后当然有一个数据属性来控制v-if。如果您没有包装元素,则始终可以使用template元素进行包装。
答案 1 :(得分:4)
这不是处理事情的方式。
请参阅此page中的mapGetters部分。它与计算机制非常吻合。
您还可以在相关组件中使用v-if,以便在VUEX中准备好数据之前不会创建组件。
答案 2 :(得分:1)
使用vue-router,您可以使用beforeRouteEnter防护加载数据异步,如下所述:https://router.vuejs.org/en/advanced/data-fetching.html
答案 3 :(得分:0)
我能想到的一种方法是,当用户在App.vue
组件中加入以检查当前路径以及它是否\login
重定向时。
这样的事情:
created() {
AuthService.getCurrentUser()
.then(user => this.setCurrentUser(user))
.then(() => {
const { path } = this.$router.currentRoute;
if (path === '/login') {
this.$router.push('/');
}
});