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?
-
24Why is this getting down voted? I need it for Vue.js. If there is some vue library or something built in it would be preferred over raw js.Rob– Rob2016年03月10日 10:54:55 +00:00Commented Mar 10, 2016 at 10:54
-
73There is not even close to a duplicate. vue.js is a framework with a specific logic, different from vanila javascriptYerko Palma– Yerko Palma2016年03月10日 12:10:42 +00:00Commented Mar 10, 2016 at 12:10
-
27How can this be accomplished without vue-router?Connor Leech– Connor Leech2017年09月29日 16:07:05 +00:00Commented Sep 29, 2017 at 16:07
-
@ConnorLeech not sure why you would want to skip vue-router, since it's designed for Vue. Please use the provided API.kissu– kissu2022年12月03日 16:47:02 +00:00Commented Dec 3, 2022 at 16:47
17 Answers 17
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'
5 Comments
vue-router than this would indeed be a duplicate, as he will need to use standard JS methods.return next({ name: 'login', query:{param1: "foo" }, }); doesn't work. inside the login component the prop param1 is undefined.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"
},
});
7 Comments
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.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() {
},
....
7 Comments
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.undefined to getVars['par2']..substring(1) seems to be unnecessaryMore detailed answer to help the newbies of VueJS:
- First define your router object, select the mode you seem fit. You can declare your routes inside the routes list.
- Next you would want your main app to know router exists, so declare it inside the main app declaration.
- Lastly the
$routeinstance holds all the information about the current route. The code will console log just the parameter passed in the url. (*Mounted is similar todocument.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)
},
});
5 Comments
<script src="https://unpkg.com/vue-router"></script>new Vue({ router, ... }) is not valid syntax.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.)
1 Comment
Vue 3 Composition API
(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
6 Comments
As of this date, the correct way according to the dynamic routing docs is:
this.$route.params.yourProperty
instead of
this.$route.query.yourProperty
8 Comments
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){ path: '/user/:id' }, the url /user/123?a=b&c=d will have $route.params == { id: "123" } and $route.query == { a: "b", c: "d" }.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?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
1 Comment
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)
}
}
1 Comment
<script setup> and skip the setup() part directly.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
1 Comment
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?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.
1 Comment
Example url: http://localhost:9528/#/course/outline/1439990638887137282
Below codes output: 1439990638887137282
this.courseId = this.$route.params.id
console.log('courseId', this.courseId)
Comments
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
Comments
Vue 3 Composition :
first include you router
import router from '../../router'
then to access the for example the id; use
router.currentRoute.value.params.id
Comments
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
Comments
if you don't want to use router and want a one line solution you can write this:
new URL(window.location.toString()).searchParams.get("test")
Comments
You can also use the qs library. To use it in your component first install it (npm install qs). Then to use it in your component:
<template>
<div>
<p>Test parameter: {{ testParam }}</p>
</div>
</template>
<script>
import qs from 'qs';
export default {
data() {
return {
testParam: null
};
},
created() {
const queryParams = qs.parse(window.location.search, {ignoreQueryPrefix: true});
this.testParam = queryParams.test;
}
};
</script>
This will parse the current URL and returns an object with the query parameters of the URL.
Comments
Explore related questions
See similar questions with these tags.