最近我将用户分成的网页设计为" user" /" admin"登录的两个角色 不同的角色会登录同一页面,但会看到不同的按钮和功能。
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
是容器所以我称之为ajax&#34; / init&#34;获取用户信息然后提交到Vuex商店
然后getTrainPerf
是MainPage.vue
内的子页面。它将通过Content.vue
消息显示不同的按钮。
但是,我想根据用户的角色在MainPage.vue
$store.state.user
内的mounted
阶段调用不同的api。
但是没有准备好这个角色,这个角色被ajax称为&#34; / init&#34;在这个阶段。
整体流程为
// MainContent.vue
Content.vue
// Content.vue
beforeCreate: async function () {
await axios.post('/init').then(response => {
if(response && response.data && response.data.data){
this.$store.commit("login", response.data.data)
}
})
}
我检查了vue组件生命周期,并且在mounted: async function() {
try {
console.log(this.$store, this.$store.state.user, this.$store.getters.isAdmin)
// no value here
}
孩子之前看到了父beforeCreate
。
生命周期方法是否会按顺序调用,即使它们是异步函数?
我该如何解决这个问题?
由于
答案 0 :(得分:3)
通过将Content
指令附加到user
组件,您可以延迟v-if
组件的初始化,直到Content
状态在Vuex中可用。只需确保在Vuex状态下使用user
初始化null
。
<!-- MainPage.vue -->
<template>
<Content v-if="$store.state.user" />
</template>
现在this.$store.state.user
以及依赖于它的所有内容都应该来自Content
组件的mounted
生命周期钩子。
答案 1 :(得分:1)
由于您使用异步调用来获取用户数据,因此您的组件生命周期不是处理此案例的可靠方法。我建议显示加载状态覆盖并使用mapGetters
访问商店。这将为您提供一种反应机制,让您了解用户数据何时可用。以下是单个文件组件的一般概念:
computed: {
...mapGetters({
getLoggedInUser: 'GET_LOGGED_IN_USER',
getIsUserAdmin: 'GET_IS_USER_ADMIN',
})
}
....
<template>
<content-overlay v-if="!getLoggedInUser">
Loading...
</content-overlay>
....
<button v-if="getIsUserAdmin">Admin Button</button>
<button v-if="!getIsUserAdmin">Regular User Button</button>
</template>