Question
I have a web page in Vue.js and I would like to expose some of the parameters in URL as query parameters. How can I do that? The idea is to make URL sharing more user-friendly, where some states of the page are visible: query string for search, filters, pagination, etc.
http://localhost:8080/#/shop?product=banana
Answer
Let’s take “product filter” as an example, where the query parameter is called
product and internally, the variable for the filter in the vue component is
called productFilter. Let’s see how to retrieve the value from query
parameters; how to update the component data
productFilter using the query parameter; and how to update the query parameter
using the component data productFilter.
Retrieve Parameter
You can access to a $route object from your components, which exposes what you
need:
this.$route.query.product // "banana"
Update Component Data
When loading the component, user already provided the query parameters. In this
case, we need to update the data (data) of the component so that the query
parameters are taken into account in the internal state. This can be done when
the component is mounted (mounted).
<script>
export default {
mounted() {
// update data when mounting the component
if ("product" in this.$route.query) {
this.productFilter = this.$route.query.product
}
},
data() {
return {
productFilter: null // no filter by default
}
},
...
}
</script>
Update Query Params
When the component is updated after an event (user clicks a button, enters some characters in the search query…), we need to ensure that our query parameters are updated as well. This can be done using:
<script>
import _ from "lodash"
export default {
...
methods: {
updateQueryParams() {
const query = {}
if (this.productFilter != null) {
query.product = this.productFilter
}
// handle more query parameters here ...
// Avoid "Error: Avoided redundant navigation to current location"
// https://stackoverflow.com/questions/62462276
if (!_.isEqual(this.$route.query, query)) {
this.$router.push({ name: "aComponent", query: query })
}
}
}
}
</script>
Going Further
How to go further from here?
- Vue Router is the official router for Vue.js. To better understand Vue Router, visit their official website.
- To better understand the lifecycle of the vue component, visite the “Lifecycle Diagram” in The Vue Instance.
Hope you enjoy this article, see you the next time!