Подтвердить что ты не робот

Как установить параметры запроса URL в Vue с помощью Vue-Router

Я пытаюсь установить параметры запроса Vue-router при изменении полей ввода, я не хочу переходить на другую страницу, но просто хочу изменить параметры запроса url на той же странице, я делаю вот так:

this.$router.replace({ query: { q1: "q1" } })

Но это также обновляет страницу и устанавливает y-позицию в 0, т.е. прокручивает ее до верхней части страницы. Является ли это правильным способом задания параметров запроса URL или есть лучший способ сделать это.


Отредактировано:

Вот мой код маршрутизатора:

export default new Router({
  mode: 'history',
  scrollBehavior: (to, from, savedPosition)  => {
    if (to.hash) {
      return {selector: to.hash}
    } else {
      return {x: 0, y: 0}
    }
  },
  routes: [
    ....... 
    { path: '/user/:id', component: UserView },
  ]
})
4b9b3361

Ответ 1

Вот пример в документах:

// with query, resulting in /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

Ссылка: https://router.vuejs.org/en/essentials/navigation.html

Как упоминалось в этих документах, router.replace работает как router.push

Итак, вы, похоже, правильно указали в своем примерном коде. Но я думаю, вам может понадобиться включить параметр name или path, чтобы маршрутизатор имел некоторый маршрут для перехода к. Без name или path это не выглядит очень значимым.

Это мое настоящее понимание сейчас:

  • query является необязательным для маршрутизатора - дополнительная информация для компонента для создания представления
  • name или path является обязательным - он решает, какой компонент будет отображаться в вашем <router-view>.

Это может быть недостающая вещь в вашем примере кода.

EDIT: Дополнительная информация после комментариев

Пробовали ли вы использовать именованные маршруты в этом случае? У вас есть динамические маршруты, и проще предоставить параметры и запрос отдельно:

routes: [
    { name: 'user-view', path: '/user/:id', component: UserView },
    // other routes
]

а затем в ваших методах:

this.$router.replace({ name: "user-view", params: {id:"123"}, query: {q1: "q1"} })

Технически нет разницы между приведенным выше и this.$router.replace({path: "/user/123", query:{q1: "q1"}}), но легче передавать динамические параметры на именованных маршрутах, чем составлять строку маршрута. Но в обоих случаях необходимо учитывать параметры запроса. В любом случае я не мог найти ничего плохого в том, как обрабатываются параметры запроса.

После того, как вы находитесь внутри маршрута, вы можете получить свои динамические параметры как this.$route.params.id, а ваши параметры запроса - this.$route.query.q1.

Ответ 2

На самом деле вы можете просто this.$router.push({query: {plan: 'private'}}) запрос следующим образом: this.$router.push({query: {plan: 'private'}})

Основано на: https://github.com/vuejs/vue-router/issues/1631

Ответ 3

Не перезагружая страницу или не обновляя dom, history.pushState может выполнить эту работу.
Добавьте этот метод в свой компонент или в другое место, чтобы сделать это:

addParamsToLocation(params) {
  history.pushState(
    {},
    null,
    this.$route.path +
      '?' +
      Object.keys(params)
        .map(key => {
          return (
            encodeURIComponent(key) + '=' + encodeURIComponent(params[key])
          )
        })
        .join('&')
  )
}

Поэтому в любом месте вашего компонента вызовите addParamsToLocation({foo: 'bar'}), чтобы передать текущее местоположение с параметрами запроса в стеке window.history.

Чтобы добавить параметры запроса в текущее местоположение , не нажимая новую запись в истории, используйте вместо этого history.replaceState.

Протестировано с Vue 2.6.10 и Nuxt 2.8.1.

Будьте осторожны с этим методом!
Vue Router не знает, что URL изменился, поэтому он не отражает URL после pushState.

Ответ 4

this.$router.push({ query: Object.assign(this.$route.query, { new: 'param' }) })

Ответ 5

Чтобы установить/удалить несколько параметров запроса одновременно, я использовал приведенные ниже методы как часть моих глобальных миксинов (this указывает на компонент vue):

    setQuery(query){
        let obj = Object.assign({}, this.$route.query);

        Object.keys(query).forEach(key => {
            let value = query[key];
            if(value){
                obj[key] = value
            } else {
                delete obj[key]
            }
        })
        this.$router.replace({
            ...this.$router.currentRoute,
            query: obj
        })
    },

    removeQuery(queryNameArray){
        let obj = {}
        queryNameArray.forEach(key => {
            obj[key] = null
        })
        this.setQuery(obj)
    },