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

#vue.js #nuxt.js #vue-router #nuxt-i18n

#vue.js #nuxt.js #vue-router #nuxt-i18n

Вопрос:

Я застрял с проблемой цикла, у которой, я думаю, не должно быть причин. В компоненте вложенной динамической страницы Nuxt (_id.vue) я хочу проверить, to.hash не пусто ли в beforeRouteLeave защите навигации, но когда я выполняю эту проверку, и это правда, я получаю RangeError: Maximum call stack size exceeded .

Я провел тест console.log('test') и увидел, что он вызывается без остановки, пока браузер не остановит его, чтобы предотвратить его сбой.

   beforeRouteLeave (to, from, next) {
    // there is hash and if the user click the back button of the browser, I want to return him to the position of the product file where he was before the click to enter into it
    if (to.name.startsWith('index___') amp;amp; to.hash !== '') {
      next({ path: to.path, hash: `#${this.$route.params.id}` })
    } else {
      next()
    }
  }
  

Это происходит только в том случае, если я проверяю to.hash !== '' , но не для to.hash === '#ct' , и я не могу понять, почему?

Если пользователь переходит с индексной страницы с хэшем в пути, если он нажимает кнопку «Назад» браузера, я хочу вернуть его в положение на странице, где он был, когда он нажал, чтобы перейти на _id страницу.

Может кто-нибудь помочь мне, пожалуйста, понять, что здесь происходит?

Спасибо

Ответ №1:

Я получил ответ, который помог мне на форуме Vue, я не знал, что next() это вызывало процесс и что мой beforeRouteLeave хук переоценивал новый to.hash , который я установил, вызывая цикл ( to.hash !== '' всегда был true).

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

вот код для устранения проблемы:

   beforeRouteLeave (to, from, next) {
    if (to.name.startsWith('index___') amp;amp; (to.hash === '#ct' | (to.hash !== `#${this.$route.params.id}` amp;amp; to.hash !== ''))) {
      next({ path: to.path, hash: `#${this.$route.params.id}` })
    } else {
      next()
    }
  }
  

Я надеюсь, что это может помочь кому-то еще.