Как запретить пользователю покидать страницу с помощью промежуточного программного обеспечения в Nuxt?

#vue.js #router #middleware #guard #nuxt.js

#vue.js #маршрутизатор #промежуточное программное обеспечение #защита #nuxt.js

Вопрос:

У меня есть приложение Nuxt, и в каком-то специальном маршруте я хочу запретить пользователю покидать страницу, показывая простой диалог подтверждения javascript.

Я сделал несколько beforeRouteLeave <- это своего рода штуковина, представленная в официальной документации Vue, но ни один из них, похоже, не работал в Nuxt.

И Nuxt рекомендует пользователям использовать промежуточное программное обеспечение для выполнения этих действий ‘beforeRoute’. Вот мой код.

 export default function (context) {
    if (process.client amp;amp;
        context.from.path.includes("board/write") amp;amp;
        context.route.name !== "board-articleId") {
        if (!confirm("Are you sure you want to leave the page?")) {
            context.next(false)
        }
    }
}
 

Как вы можете видеть, я проверяю, является ли мой текущий маршрут определенной страницей (context.from.path …), спрашиваю пользователя, хочет ли он покинуть страницу. И если они отменены, что делает подтверждение ложным, сделайте

следующий (ложный)

и это прекрасно работает, поскольку заставляет пользователя оставаться на странице.

Но проблема в том, что панель загрузки браузера все равно загружается, даже если страница не меняется. И похоже, что маршрут все равно все равно меняется, несмотря на то, что сама страница не меняется.

Как я могу предотвратить это?

Ответ №1:

Чтобы убедиться, что запрос адресной строки ( ?bla=bla ) не затронут, я рекомендую сделать это:

 export default function ({ from }) {
  redirect(from);
}
 

Ответ №2:

Я мог бы использовать

 redirect(from.path)
 

вместо

 next(false)
 

Для информации,
входящий аргумент ‘context’ имеет некоторые свойства, как показано ниже:

 from, route, next, redirect...