How can I fetch query parameters in Vue.js?
E.g.
http://somesite.com?test=yay
Can’t find a way to fetch or do I need to use pure JS or some library for this?
How can I fetch query parameters in Vue.js?
E.g.
http://somesite.com?test=yay
Can’t find a way to fetch or do I need to use pure JS or some library for this?
According to the docs of route object, you have access to a $route
object from your components, which exposes what you need. In this case
// from your component
console.log(this.$route.query.test) // outputs 'yay'
vue-router
than this would indeed be a duplicate, as he will need to use standard JS methods. –
Safeconduct return next({ name: 'login', query:{param1: "foo" }, });
doesn't work. inside the login component the prop param1
is undefined. –
Metropolis Try this code
var vm = new Vue({
created() {
let urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('yourParam')); // true
console.log(urlParams.get('yourParam')); // "MyParam"
},
});
window
is not available. This is indeed a bad approach, nothing elegant here so far. Please use the given APIs provided by Vue's ecosystem. Vue-router is reactive, and comes with several things in mind, if it was created there is a valid reason. It is not a thing done just for fun. I hope nobody is using window.location.href
here, otherwise everybody is nuking their SPA. –
Ingenue Without vue-router, split the URL
var vm = new Vue({
....
created() {
let uri = window.location.href.split('?');
if(uri.length == 2) {
let vars = uri[1].split('&');
let getVars = {};
let tmp = '';
vars.forEach(function(v) {
tmp = v.split('=');
if(tmp.length == 2)
getVars[tmp[0]] = tmp[1];
});
console.log(getVars);
// do
}
},
updated() {
},
....
Another solution https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search:
var vm = new Vue({
....
created() {
let uri = window.location.search.substring(1);
let params = new URLSearchParams(uri);
console.log(params.get("var_name"));
},
updated() {
},
....
location.href
yourself when there is location.search
readily available? developer.mozilla.org/en-US/docs/Web/API/… e.g. var querypairs = window.location.search.substr(1).split('&');
Also splitting the query name-value pairs by '=' will not always work as you can pass named query parameters without value as well; e.g. ?par1=15&par2
Your code would now raise an exception on par2 as splitting by '=' will result in tmp with only 1 element. –
Horizontal undefined
to getVars['par2']
. –
Horizontal .substring(1)
seems to be unnecessary –
Goldsmith More detailed answer to help the newbies of VueJS:
$route
instance holds all the information about the current route. The code will console log just the parameter passed in the url. (*Mounted is similar to document.ready
, i.e. it's called as soon as the app is ready)And the code itself:
<script src="https://unpkg.com/vue-router"></script>
var router = new VueRouter({
mode: 'history',
routes: []
});
var vm = new Vue({
router,
el: '#app',
mounted: function() {
q = this.$route.query.q
console.log(q)
},
});
<script src="https://unpkg.com/vue-router"></script>
–
Fare new Vue({ router, ... })
is not valid syntax. –
Karate Another way (assuming you are using vue-router
), is to map the query param to a prop in your router. Then you can treat it like any other prop in your component code. For example, add this route;
{
path: '/mypage',
name: 'mypage',
component: MyPage,
props: (route) => ({ foo: route.query.foo }),
}
Then in your component you can add the prop as normal;
props: {
foo: {
type: String,
default: null,
}
},
Then it will be available as this.foo
and you can do anything you want with it (like set a watcher, etc.)
(as far as now 2021, vue-router 4)
import {useRoute} from "vue-router";
//can use only in setup()
useRoute().query.test
or
//somewhere in your src files
import router from "~/router";
//can use everywhere
router.currentRoute.value.query.test
or
import {useRouter} from "vue-router";
//can use only in setup()
useRouter().currentRoute.value.query.test
As of this date, the correct way according to the dynamic routing docs is:
this.$route.params.yourProperty
instead of
this.$route.query.yourProperty
query
to get the queries from the URL. From the docs: In addition to $route.params, the $route object also exposes other useful information such as $route.query (if there is a query in the URL) –
Consistence { path: '/user/:id' }
, the url /user/123?a=b&c=d
will have $route.params == { id: "123" }
and $route.query == { a: "b", c: "d" }
. –
Enrico params
means the parameters in your URL
like /user/:username
. You see that the username
is params
but query params
are alike this /search/?q='new Vue js'
, As you see, the new Vue js
is a query param here. And there is nothing in the document that proves your answer. Please tell me which line of the document you see those? –
Jape You can use vue-router.I have an example below:
url: www.example.com?name=john&lastName=doe
new Vue({
el: "#app",
data: {
name: '',
lastName: '',
},
beforeRouteEnter(to, from, next) {
if(Object.keys(to.query).length !== 0) { //if the url has query (?query)
next(vm => {
vm.name = to.query.name;
vm.lastName = to.query.lastName;
});
}
next();
}
})
Note: In beforeRouteEnter
function we cannot access the component's properties like: this.propertyName
.That's why i have pass the vm
to next
function.It is the recommented way to access the vue instance.Actually the vm
it stands for vue instance
site.com/route?query=test
the query
param returns undefined
when accessed via the to
param in the beforeRouteEnter(to, from, next)
method. Any ideas why this could be so? –
Teleplay If your url looks something like this:
somesite.com/something/123
Where '123' is a parameter named 'id' (url like /something/:id), try with:
this.$route.params.id
Here is how to do it if you are using vue-router
with vue3 composition api
import { useRoute } from 'vue-router'
export default {
setup() {
const route = useRoute()
console.log(route.query)
}
}
<script setup>
and skip the setup()
part directly. –
Ingenue On top of the answers here, I recommend that you use the Vue devtools for further debugging.
Given this snippet of code
<template>
<div>
{{ showOrNotTheMessage }}
</div>
</template>
<script>
export default {
computed: {
showOrNotTheMessage() {
return this.$route.query?.lookingforthis
? 'Show this message'
: 'Dont show this message'
},
},
}
</script>
This one will mainly display a conditional string as an example.
If you want to further debug what you're doing (with either Options or Composition API), you can select the root
component in your Vue devtools and then access the whole Vue instance in your console with
$vm0.$route.query
PS: in Vue3, you need to use the following to access the Vue instance via the Devtools.
$vm0.proxy.$route.params.query
That can help you debug your code faster and potentially find cool stuff to play with.
Example url: http://localhost:9528/#/course/outline/1439990638887137282
Below codes output: 1439990638887137282
this.courseId = this.$route.params.id
console.log('courseId', this.courseId)
one thing to keep in mind if you are using Hash mode then don't use this.$route.params.name only use url search param
first include you router
import router from '../../router'
then to access the for example the id; use
router.currentRoute.value.params.id
Instead of each time you want to call a param you have to call $route
then params
then your param this.$route.params.parma1
, this.$route.params.parma2
, this.$route.params.parmaX
Why not doing it in computed:
computed: {
params:function () {
return this.$route.params;
}
then simply calling it from params
is much more readable and easy to use : this.params.parma1
, this.params.parma2
, this.params.parmaX
© 2022 - 2025 — McMap. All rights reserved.