【发布时间】:2020-04-20 02:58:57
【问题描述】:
我正在尝试根据用户是否登录来切换登录和退出按钮。我可以有效地使用 v-if,但我必须刷新页面才能看到切换发生。即,当您退出时,您必须重新加载页面才能将“退出”按钮更改为“登录”按钮。
模板:
<div v-if="signedIn">
<v-btn class="ml-4 mr-4 primary" @click="logout">
<span>Sign Out</span>
<v-icon>mdi-logout</v-icon>
</v-btn>
</div>
<div v-else>
<v-btn class="ml-4 mr-4 primary" @click="$router.push('/login')">
<span>Sign In</span>
<v-icon>mdi-login</v-icon>
</v-btn>
</div>
JavaScript:
data() {
return {
drawer: true,
signedIn: this.$store.getters.isLoggedIn || false,
};
},
在不使用页面刷新的情况下,Vue 处理切换的方式是什么?我确信有更好的方法,只是对 Vue 的新手来说,我发现的大多数教程都没有帮助。任何提示、建议或建议表示赞赏!
编辑
商店:
import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
status: '',
token: localStorage.getItem('token') || '',
user: {},
},
mutations: {
auth_request(state) {
state.status = 'loading';
},
auth_success(state, token, user) {
state.status = 'success';
state.token = token;
state.user = user;
},
auth_error(state) {
state.status = 'error';
},
logout(state) {
state.status = '';
state.token = '';
},
},
actions: {
login({ commit }, user) {
return new Promise((resolve, reject) => {
commit('auth_request');
axios({ url: 'http://localhost:5000/api/v1/login', data: user, method: 'POST' })
.then((resp) => {
const { token } = resp.data;
// eslint-disable-next-line no-shadow
const { user } = resp.data;
localStorage.setItem('token', token);
axios.defaults.headers.common.Authorization = token;
commit('auth_success', token, user);
resolve(resp);
})
.catch((err) => {
console.log('err:', err.response);
commit('auth_error');
localStorage.removeItem('token');
reject(err);
});
});
},
logout({ commit }) {
return new Promise((resolve) => {
commit('logout');
localStorage.removeItem('token');
delete axios.defaults.headers.common.Authorization;
resolve();
});
},
},
getters: {
isLoggedIn: state => !!state.token,
authStatus: state => state.status,
},
});
【问题讨论】:
-
你做得对,所以肯定有其他问题(你的数据不是反应性的)。也许将商店设置添加到您的问题中......
-
@MichalLevý 我添加了商店
标签: javascript vue.js vuejs2 vue-component