【发布时间】:2021-01-26 21:32:35
【问题描述】:
我有一个导航栏,我只根据用户的角色显示某些菜单项。
这是 HTML(为了简化,我删除了所有菜单项,除了一个):
<v-speed-dial class="speed-dial-container contextual-text-menu" v-if="user && user.emailVerified" fixed top right
direction="bottom" transition="slide-y-transition">
<v-icon v-if="checkAuthorization(['superAdmin', 'admin', 'pastor', 'member']) === true" class="mt-2"
@click="sendComponent({ component: 'Dashboard' })">$admin</v-icon>
</v-speed-dial>
我的方法:
async checkAuthorization(permissions) {
if (permissions.length > 0) {
const temp = await this.$store.dispatch('UserData/isAuthorized', permissions)
return temp
}
},
Vuex 商店:
isAuthorized({
state
}, permissions) {
const userRoles = state.roles
if (permissions && userRoles) {
const found = userRoles.some(r => permissions.includes(r))
return found
}
},
我的所有控制台日志都显示正确的值,但 HTML 没有相应响应。
示例:在这行代码checkAuthorization(['superAdmin', 'admin', 'pastor', 'member']) === true 中,我添加了“成员”,并且我以仅具有“成员”角色的用户身份登录。查看控制台日志时,所有内容都返回 true,所以我应该看到这个菜单项,但它没有显示。
【问题讨论】:
-
你的
checkAuthorization是一个异步函数,所以它总是返回 Promise 并且 Promise 不等于 true。 -
如果我删除异步,我会在控制台中得到 [object Promise]
-
我删除了异步并在控制台中得到了这个
Promise {<pending>} __proto__: Promise [[PromiseState]]: "fulfilled" [[PromiseResult]]: true -
问题是你不能像那样绑定异步函数(并且 Vuex 调度函数是异步的)所以你必须创建另一个变量,例如
role然后在调度函数解析后设置此变量,并以created/mounted钩子之类的方式调用checkAuthorization。 -
@User28 我认为这行得通。把它放在一个答案中,我会接受它。
标签: javascript vue.js vuejs2 vue-component vuex