簡體   English   中英

如何防止用戶在登錄Vuejs后轉到登錄頁面?

[英]How to prevent user to go to login page after logged in in Vuejs?

用戶登錄后,我不希望用戶訪問登錄頁面。 我已經在下面嘗試過這個,但它似乎不起作用。 我應該怎么做才能使它工作?

[更新]

當我console.log(store.getters.loggedIn inside else if語句返回 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
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM