Добавление определенных параметров запроса из предыдущего маршрута в новый маршрут в маршрутизаторе Vue

При передаче параметров запроса из предыдущего маршрута в новый маршрут через навигационные щитки beforeEach, столкнулся со следующей ошибкой бесконечного цикла Detected an infinite redirection in a navigation guard

Требование: Для любого заданного действительного маршрута в приложении Vue, когда ему передается параметр запроса (Например: ваш сайт/целевая страница/?displayNav=true) Последующие изменения маршрута должны сохранять указанный выше параметр запроса.

Использование "vue-router": "^4.1.6"

Поскольку это необходимо для всех допустимых маршрутов в приложении Vue, Следовал подходу навигационных охранников, используя beforeEach Вот кодовый блок, который перехватывает каждое изменение маршрута и добавляет displayNav, если он присутствует.

// guards.js
export const appendQueryParamsToRoute = (to, from, next) => {
  const query = Object.assign({}, to.query)

  // Check if the displayNav param exists in the previous route's query params
  if (from.query['displayNav']) {
    query['displayNav'] = 'true'
  }

  next({
    path: to.path,
    query
  })
}
// router.js
router.beforeEach(appendQueryParamsToRoute)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы на правильном пути. Ваша ошибка может быть связана с конфликтами запросов. Вы можете сначала попробовать проверить параметры запроса в обоих направлениях, а затем передать их:

// guards.js
export const persistRouteQuery = (to, from, next) => {
    const query = { ...to.query, ...from.query }

    if (!Object.keys(to.query).length && Object.keys(from.query).length) {
        next({ ...to, query })
    } else {
        next()
    }
}

// router.js
router.beforeEach(persistRouteQuery)

Вот более надежное решение, основанное на предыдущем коде и вашем примере, которое проходит только по явно определенным запросам маршрута:

// guards.js
const persistentQueries = ['displayNav']

const hasQuery = (route, queryKeys = [])=> {
    const keys = Object.keys(route.query)
    const hasKeys = !!keys.length

    if (queryKeys.length && hasKeys) {
        return keys.some((k) => queryKeys.includes(k))
    }

    return hasKeys
}

const toWithQuery = (to, path, queryKeys) => {
    const query = to.query
    const params = to.params

    const withQuery = queryKeys.reduce((keys, key) => {
        if (query[key]) {
            keys[key] = query[key]
        }

        return keys
    }, {})

    return { path, params, query: withQuery }
}

export const persistRouteQuery = (to, from, next) => {
    if (!hasQuery(to) && hasQuery(from, persistentQueries)) {
        next(toWithQuery({ ...to, query: from.query }, to.path, persistentQueries))
    } else {
        next()
    }
}

// router.js
router.beforeEach(persistRouteQuery)

Существует также другая тема о передаче параметров запроса в дочерние маршруты, которые могут вам помочь.

Это работает! Спасибо Сэмюэлю за вашу помощь. Я пропустил добавление (базового) условия appendQueryParamsToRoute, что привело к бесконечным перенаправлениям. Условие заключается в том, что если TO и FROM различны, перейдите к next()

Jay Joshi 17.04.2023 13:23

Другие вопросы по теме