【问题标题】:How to toggle buttons with Vue without a page refresh如何在不刷新页面的情况下使用 Vue 切换按钮
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 那在组件的模板部分会是什么样子呢?我会在 v-if 中调用该方法吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2020-05-29
  • 2019-11-25
  • 2017-12-21
  • 2017-05-11
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多