javascript - 如何在不刷新页面的情况下使用 Vue 切换按钮

标签 javascript vue.js vuejs2 vue-component

我正在尝试根据用户是否登录来切换登录和退出按钮。我可以有效地使用 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,
      },
    });

最佳答案

数据属性 signedInthis.$store.getters.isLoggedIn 没有反应。

尝试使用返回 this.$store.getters.isLoggedIn 的计算方法代替:

computed: {
    signedIn() {
        return this.$store.getters.isLoggedIn;
    }
}

关于javascript - 如何在不刷新页面的情况下使用 Vue 切换按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59546496/

相关文章:

javascript - 带有 Greensock JS 钩子(Hook)的 Vue 列表动画 : wait for leave to finish before enter

javascript - 为什么我的组件没有导入到 App.vue 中?

javascript - 在模式 : 'history' vue router doesn't work 之后

javascript - 我想将 cmd 输出写入文件而不是 stdout

javascript - JScript/VBScript 错误

javascript - 将Google结果对象(纯js)转换为Python对象

javascript - Bootstrap Vue, <b-table> 带有基于表格绑定(bind)项数据的复选框输入

javascript - 根据第二个数组中的值过滤对象数组

javascript - 如何重置/删除 vuex 存储数据?

javascript - vue动态组件,重复信息