Я создаю панель навигации, которая показывает или скрывает кнопки в зависимости от того, вошел пользователь в систему или нет.
Для этого я сохраняю состояние в Vuex и localStorage.
Я пытаюсь создать динамическое меню, используя список объектов (например, rightMenu
), который содержит информацию о кнопках (например, маршрут, заголовок и флаг, указывающий, может ли кнопка отображаться или нет, если пользователь вошел в систему).
Всегда, когда пользователь входит в систему, this.$store.state.auth.isUserLoggedIn
изменяется на true
, однако шаблон не изменяется, кнопка остается в том же начальном состоянии, когда пользователь не вошел в систему.
Например: кнопка sign out
не отображается при обновлении this.$store.state.auth.isUserLoggedIn
.
Но когда я нажимаю «Ctrl + F5» и страница перезагружается, кнопки отображаются правильно.
В этом случае, например, кнопка sign out
отображается правильно, когда я перезагружаю страницу вручную.
Я собираюсь заставить страницу перезагрузиться снова, когда пользователь входит в систему или выходит из нее, однако я считаю, что это не очень хороший вариант.
Может ли кто-нибудь мне помочь?
Я даю код, который я использую ниже.
Заранее спасибо.
Menu.vue> шаблон
<div>
<v-toolbar color='grey darken-3' dark>
<v-toolbar-title>Site</v-toolbar-title>
...
<v-toolbar-items class='hidden-sm-and-down'>
<v-btn v-for='item in rightMenu' :key='item.title'
:to='item.to' v-if='item.showButton' flat>
{{ item.title }}
</v-btn>
</v-toolbar-items>
</v-toolbar>
<router-view/>
</div>
Menu.vue> script
export default {
data () {
return {
rightMenu: [
{ to: '/sign_in', title: 'sign in'
showButton: !this.$store.state.auth.isUserLoggedIn },
{ to: '/sign_up', title: 'sign up'
showButton: !this.$store.state.auth.isUserLoggedIn },
{ to: '/sign_out', title: 'sign out'
showButton: this.$store.state.auth.isUserLoggedIn }
]
}
},
...
}
store.js
const store = new Vuex.Store({
state: {
auth: {
token: '',
isUserLoggedIn: false
}
},
mutations: {
setAuthToken (state, token) { // I use it on the Login
state.auth.token = token
state.auth.isUserLoggedIn = !!token
localStorage.setItem('store', JSON.stringify(state))
},
cleanAuth (state) { // I use it on the Logout
state.auth = {
token: '',
isUserLoggedIn: false
}
localStorage.setItem('store', JSON.stringify(state))
}
}
...
})
РЕДАКТИРОВАТЬ 1:
Когда я явно использую this.$store.state.auth.isUserLoggedIn
в своем коде, это работает хорошо. Итак, кнопка появляется и исчезает правильно. Я приведу ниже пример:
Menu.vue> шаблон
<v-toolbar-items class='hidden-sm-and-down'>
<v-btn v-if='this.$store.state.auth.isUserLoggedIn' flat>
Test {{ this.$store.state.auth.isUserLoggedIn }}
</v-btn>
</v-toolbar-items>
Следовательно, я считаю, что проблема заключается в связывании showButton
с this.$store.state.auth.isUserLoggedIn
.