javascript - Vuejs如何防止用户登录后进入登录页面?

标签 javascript vue.js vue-router

用户登录后,我不希望用户访问登录页面。我已经在下面尝试过这个,但似乎不起作用。我应该怎么做才能使其正常工作?

[已更新]

当我在 else if 语句内 console.log(store.getters.loggedIn) 时,它返回 false,所以我认为问题可能出在 store.getters。由于我是 Vuejs 的初学者,我真的不知道如何解决它。我将在下面添加我的 vuex 代码。希望我能得到一些帮助。

先谢谢了!

// vuex
export default new Vuex.Store({
  state: {
    accessToken: null,
    refreshToken: null,
    APIData: "",
  },
  mutations: {
    updateStorage(state, { access, refresh }) {
      state.accessToken = access;
      state.refreshToken = refresh;
    },
    destroyToken(state) {
      state.accessToken = null;
      state.refreshToken = null;
    },
  },
  getters: {
    loggedIn(state) {
      return state.accessToken != null;
    },
  },
  actions: {
    userLogout(context) {
      console.log("hello");
      if (context.getters.loggedIn) {
        context.commit("destroyToken");
      }
    },
    userLogin(context, usercredentials) {
      return new Promise((resolve, reject) => {
        getAPI
          .post("/rest-api-token/", {
            email: usercredentials.email,
            password: usercredentials.password,
          })
          .then((response) => {
            context.commit("updateStorage", {
              access: response.data.access,
              refresh: response.data.refresh,
            });
            resolve();
            console.log(this.getters.loggedIn); <-- return true
          })
          .catch((err) => {
            reject(err);
          });
      });
    },
  },
  modules: {},
});

// main.js
router.beforeEach((to, from, next) => {
  if (to.matched.some((record) => record.meta.requiresLogin)) {
    if (!store.getters.loggedIn) {
      next({ name: "login" });
    } 
    else {
      next();
    }
  } 
  // if user is logged in and go to log in page redirect them to home page
  else if (to.matched.some(record => record.meta.requiresVisitor)) {
    if (store.getters.loggedIn) {
      next({ name: 'home'});
    }
    else {
      next();
    }
  }
  // 
  else {
    next();
  }
});

//index.js (router)
const routes = [
  {
    path: "/",
    name: "login",
    component: Login,
    meta: {
      requiresVisitor: true,
    },
  },
  {
    path: "/home",
    name: "home",
    component: Home,
    meta: {
      requiresLogin: true,
    },
  },
  {
    path: "/logout",
    name: "logout",
    component: Logout,
  },
];

最佳答案

我会在我的商店中添加一个名为:

state: {
    accessToken: null,
    refreshToken: null,
    APIData: "",
    loggedIn: false //<<<<<<<<<<<<<<<<<<<<< HERE
  },

如果用户成功登录,那么我会为登录过程添加一个突变

mutations: {
    updateStorage(state, { access, refresh }) {
      state.accessToken = access;
      state.refreshToken = refresh;
    },
    destroyToken(state) {
      state.accessToken = null;
      state.refreshToken = null;
    },
    loginAttempt(state, payload) { //<<<<<<<<<<<<<<HERE
      state.loggedIn = payload
    }

  },

如果成功则将登录状态切换为 true,如果失败则将登录状态切换为 false。

然后我在您的登录组件中添加 v-if="userIsLoggedIn"并在用户未登录时切换登录并显示登录组件或隐藏它


当然,userIsLoggedIn 应该是计算出来的:

computed: {
  userIsLoggedIn: function() {
    return this.$store.state.loggedIn
  }
}

关于javascript - Vuejs如何防止用户登录后进入登录页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63986750/

相关文章:

javascript - 有条件地禁用父级的子级按钮 - React

javascript - 简单的javascript提示计算器

node.js - Vuejs 与 vue-cli : Error when running "npm run dev"

vue.js - 如何保持两个相同的 Vue 组件彼此同步?

javascript - 如何根据路由和使用 vue-route 更改 Vue 组件中的数据对象?

docker - Nginx 405当另一个站点重定向到我的vue应用程序时不允许

javascript - 如何在 vuex 商店中使用 vue-resource ($http) 和 vue-router ($route)?

javascript - 如何在 HTML/纯 JS 中保存选择下拉菜单选项?

vue.js - Nuxt serverMiddleware 从 API 获取 json

javascript - 错误行中的Foundation.min.js