У меня есть навигация с кнопкой, которая переключает меню и кнопкой входа.
Когда пользователь не авторизован, он может видеть только кнопку «Войти». Когда пользователь входит в систему, эта кнопка исчезает, и он / она может видеть кнопку гамбургера, которая переключает меню пользователя.
У меня есть условие на основе атрибута isLoaded, который может быть ложным или истинным в зависимости от ответа API (загружены ли данные профиля или нет, что происходит после входа в систему). Он работает правильно, но кнопка «Войти» появляется на мгновение, когда я перезагружаю страницу и после перенаправления на главную страницу после процесса входа. Интересно, как мне этого избежать.
Я подозреваю, что эта кнопка отображается, когда приложение ожидает ответа API, и как только оно видит isLoaded: true, оно скрывает кнопку после проверки условия.
Вот мой код:
<v-toolbar app fixed dark color = "light-blue lighten-2">
<user-nav-button v-if = "getProfile.isLoaded"
@toggle-drawer = "$refs.drawer.drawer = !$refs.drawer.drawer" />
<v-toolbar-title v-if = "getProfile.isLoaded">
<router-link :to = "{ name: '/' }"
class = "white--text" >
APP
</router-link>
</v-toolbar-title>
<v-spacer></v-spacer>
<router-link :to = "{ name: 'login' }"
class = "sign-in-button"
v-if = "!getProfile.isLoaded">
SIGNIN
</router-link>
</v-toolbar>
<profile-sidebar v-if = "getProfile.isLoaded"
ref = "drawer" />
<script>
export default {
data() {
return {
drawer: '',
};
},
components: {
UserNavButton,
ProfileSidebar,
MainFooter,
},
created() {
this.loadProfile();
},
computed: {
...mapGetters(['getProfile']),
},
methods: {
...mapActions(['loadProfile']),
},
};
<script>
Мой магазин:
export default {
state: {
profile: {
isLoaded: false,
data: [],
},
},
actions: {
loadProfile({ commit }) {
if (config.token !== '') {
http
.post('api')
.then(({ data }) => {
commit('SET_PROFILE', data);
});
}
},
},
mutations: {
SET_PROFILE(state, data) {
state.profile = {
isLoaded: true,
data,
};
},
},
getters: {
getProfile(state) {
return state.profile;
},
},
};
Спасибо за ответ. Этот атрибут уже имеет значение по умолчанию false. Он переключается на true, когда я создаю действие с мутацией. Эта мутация переключает isLoaded на true.



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


Ваша кнопка делает именно то, что вы ей говорите.
<router-link :to = "{ name: 'login' }"
class = "sign-in-button"
v-if = "!getProfile.isLoaded">
Когда getProfile.isLoaded ложный, вы его показываете. И это также ваше состояние по умолчанию.
Лично я бы отделил isloaded от данных профиля. Используйте свойство данных loadingfinished (или свойство $store)
На самом деле вы хотите, чтобы эта кнопка отображалась только при выполнении двух условий:
загрузка закончена
вы знаете, что пользователь НЕ вошел в систему.
Благодарю за ответ. Я добавил свой код из магазина. К сожалению, это решение для меня ничего не изменило. :(
@OlgaB Код вашего магазина выглядит нормально. Как вы вызываете это в своих методах компонента представления?
@OlgaB - Я отредактировал свой ответ, основываясь на вашем коде. Надеюсь, это поможет.
Большое спасибо за ваш совет. Я отметил это как решение, однако предпочел создать метод в main.js, где я проверяю, есть ли у меня токен или нет. Затем я использовал директивы v-if, основанные на этом методе. Работает отлично. :)
Пожалуйста. Метод проверки звучит более тщательно, чем то, что я показываю здесь, но для других читателей StackOverflow лучше простой ответ, подобный моему. Разработчики всегда могут усложнить ситуацию самостоятельно.
Просто укажите значение по умолчанию для
getProfile.isLoaded. Итак, пока он ожидает данных, у вас есть значение по умолчанию, в котором теперь отображается элемент.