【问题标题】:Vuex function execute before the otherVuex 函数先于其他函数执行
【发布时间】:2019-03-01 08:13:19
【问题描述】:

我正在使用 Vue + VuexlocalStorage 中删除用户令牌,以使用户注销并将他们重定向到登录页面。

组件注销方法代码:

methods: {
      logout () {
        this.$store.dispatch('logout')
          .then(response => {
            this.$router.push({ name: 'login'});
          }).catch((e) => {
            console.log(e);
          });
      }
    }

商店操作代码:

logout({commit}) {
    return new Promise((resolve, reject) => {
      try {
        commit('logout');
        resolve("done");
      } catch (e) {
        reject(e);
      }
    });
  }

存储变异函数:

logout (state) {
    localStorage.removeItem('user');
    state.is_logged_in = false;
    state.user = null;
  }

问题是:

发生了什么:

  1. 用户重定向到登录页面。
  2. 用户重定向回仪表板。
  3. 用户访问令牌已删除。

所以用户停留在同一个页面。

这意味着:

action 方法被调度,然后它返回到组件注销方法,然后它提交突变。

【问题讨论】:

  • 我在上面的代码中看不到任何可能在执行commit('logout') 之前发生的任何事情。我怀疑那里有一个异步调用,OP 是 a) 没有显示,b) 没有等待完成
  • @Phil 在用户注销并删除他的 localStorage 后重定向是正确的方法吗?
  • "what" 是正确的方式吗?

标签: javascript vue.js promise vuex


【解决方案1】:

我只是向你展示我的注销功能,也许它会对你有所帮助:

  logout() {
      this.$store.dispatch("setToken", null);
      this.$store.dispatch("setAdmin", null);
      this.$router.push({
        name: "root"
      });
    }

在商店里:

mutations: {
    setToken (state, token) {
      state.token = token
      if (token) {
        state.isAdminLoggedIn = true
      } else {
        state.isAdminLoggedIn = false
      }
    },
    setAdmin (state, admin) {
      state.admin = admin
    }
  },
  actions: {
    setToken ({ commit }, token) {
      commit('setToken', token)
    },
    setAdmin ({ commit }, admin) {
      commit('setAdmin', admin)
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2019-03-17
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多