Сложность перенаправления на страницу 404

#javascript #vue.js #vue-router

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

Вопрос:

Я пытаюсь перенаправить на страницу 404, если посещенный профиль пользователя не существует. Я запускаю асинхронный созданный перехват жизненного цикла, который проверяет, существует ли пользователь, и если нет, я использую $router.push для перехода на страницу 404, как показано ниже:

component.vue

 async created() {
    const userExists = await this.$store.dispatch("user/creatorExists", {
        userId: this.$route.params.userId
    });
    if (!userExists) {
        this.$router.push({ name: "pageNotFound" });
    }
  

Проблема в том, что во время вызова для проверки, существует пользователь или нет, component.vue загрузится полностью, поэтому конечный пользователь увидит, как начальный компонент мерцает на их экране перед перенаправлением.

Есть ли лучший способ перенаправить на страницу 404, если пользователь не существует?

Ответ №1:

Используйте beforeRouteEnter встроенную защиту навигации

 import store from "wherever/your/store/lives"

export default {
  name: "UserProfile",
  async beforeRouteEnter (to, from, next) {
    const userExists = await store.dispatch("user/creatorExists", {
        userId: to.params.userId
    });
    if (!userExists) {
        return next({ name: "pageNotFound" });
    }
    next()
  },
  // data, computed, methods, etc
}
  

Смотрите также Выборка данных — выборка перед навигацией

Обратите внимание, что нет доступа к компоненту Vue через this внутри beforeRouteEnter guard, поэтому вам нужно будет импортировать свой store из любого места, где он определен.

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

1. Спасибо. В чем преимущество этого перед router.beforeEach?

2. @Matt защита глобальной навигации выполняется при каждом изменении маршрута, независимо от того, какой маршрут. Они являются хорошим местом для глобальной логики (например, проверки подлинности), но я думал, что приведенный выше пример использования был очень специфичным для этого конкретного компонента

Ответ №2:

Мое предложение заключается в том, что вы должны поместить логику в глобальный, прежде чем охранять использование router.beforeEach

 const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
 // Check each time before entering the page or a specific page  
})