У меня есть компонент Vue для боковой панели с шаблоном, определенным как:
Vue.component('navigation',{
template:`
<ul class = "nav">
<li v-if = "checkIfUserIsAdmin() == true" id = "adminMenu"></li>
<li id = "userMenu"></li>
`,
methods: {
checkIfUserIsAdmin() {
var result = false;
axiosInstance.get("/Profile/GetUserInfo").then(userInfo => {
result = userInfo.data.u.isAdmin;
})
.catch(userError => {
swal({
title: "Operational Platform",
text: "Unable to retrieve user info"
});
result = false;
});
return result;
}
}
});
Некоторый код был удален для краткости.
Когда я посещаю /Profile/GetUserInfo, я получаю взамен JSON, который правильно возвращает мне true, но adminMenu не отображается, и мне интересно, почему. Похоже, v-if - это то место, где я напортачил. Я попытался также изменить adminMenu на v-if = "checkIfUserIsAdmin() == 'true'", но это все равно не сработало.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно дождаться результата метода.
Сначала вам нужно запустить метод checkIfUserIsAdmin при монтировании компонента.
В методе checkIfUserIsAdmin вам нужно сохранить результат запроса в переменной adminMenuDisplay, а затем вы можете посмотреть эту переменную в v-if.
Vue.component('navigation',{
template:`
<ul class = "nav">
<li v-if = "adminMenuDisplay" id = "adminMenu"></li>
<li id = "userMenu"></li>
`,
data() {
return {
adminMenuDisplay: false
};
}
methods: {
checkIfUserIsAdmin() {
var result = false;
axiosInstance.get("/Profile/GetUserInfo").then(userInfo => {
this.adminMenuDisplay = userInfo.data.u.isAdmin;
})
.catch(userError => {
swal({
title: "Operational Platform",
text: "Unable to retrieve user info"
});
this.adminMenuDisplay = false;
});
}
},
mounted() {
this.checkIfUserIsAdmin();
}
});
Сработало отлично. Благодаря этому я теперь лучше понимаю жизненный цикл компонентов.
использует свойство watch / data вместо
v-if = "async function"