Вот что вы должны сделать.Прежде всего, вы должны установить все ваши фильтры в data()
data() {
return {
filter: {
first: this.$route.params.first || null,
second: this.$route.params.second || null,
third: this.$route.params.third || null
}
}
}
Затем вы настраиваете наблюдатель, который срабатывает при изменении любого фильтра, очевидно, вам нужно v-моделировать входы в вашем <template>
к полям в data()
watch() {
filter: {
handler(newFilters) {
const q = complexToQueryString({
...this.filter,
})
const path = `${this.$route.path}?${q}`
this.$router.push(path)
}
}
}
Функция complexToQueryString - моя вещь, которая удаляет нулевые значения из запроса, а также работает для фильтров, которые являются массивами.Я сделал это, потому что мой API читает null как String 'null'.
const complexToQueryString = (object, parentNode = null) => {
const query = Object.entries(object).map((item) => {
const key = parentNode ? `${parentNode}[${item[0]}]` : item[0]
const value = item[1]
if (Array.isArray(value)) {
return arrayToQueryString(value, key)
} else if (value instanceof Object) {
return complexToQueryString(value, key)
} else if (item[1] !== undefined) {
return [
Array.isArray(item[0]) ? `${key}[]` : key,
encodeURIComponent(item[1]),
].join('=')
}
return ''
})
.filter(empty => empty)
.join('&')
return query
}
Теперь это должно работать, если вы измените значение фильтра, тогда data.filter.first изменит значение, которое запускает наблюдатель,который обновляет URL.
Самое лучшее в этом подходе - это то, что теперь вы можете копировать и вставлять URL, а фильтр точно такой же и возвращает тот же результат.