Как запретить пользователю переходить на страницу входа в систему после входа в Vuejs?

#javascript #vue.js #vue-router

#javascript #vue.js #vue-маршрутизатор

Вопрос:

После входа пользователя в систему я не хочу, чтобы пользователь получал доступ к странице входа в систему. Я пробовал это ниже, но, похоже, это не работает. Что я должен сделать, чтобы это работало?

[Обновлено]

Когда я console.log(store.getters.loggedIn внутри 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,
  },
];
  

Комментарии:

1. Это выглядит довольно последовательно. Вы отлаживали эти значения, может быть, есть какая-то проблема с вашими store.getters?

2. Я помещаю console.log(store.getters.LoggedIn) в else if оператор, и он возвращает false:(

3. итак, это решено?

4. Нет, это еще не решено

5. хорошо, позвольте мне перефразировать это;) ваш текущий вопрос: почему store.getters.loggedIn false, не так ли? Как приведенный выше код должен работать, если иначе?

Ответ №1:

я бы добавил состояние в свой магазин под названием:

 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
  }
}