如何从Vue.js中的URL获取查询参数?


247

如何在Vue.js中获取查询参数?

例如http://somesite.com?test=yay

找不到获取方法,或者我需要为此使用纯JS或某些库吗?


5
为什么要对此投票?我需要Vue.js。如果有一些vue库或内置的东西,它将比原始js更可取。
罗布

如果您正在使用Vue路由器,可能会有某种功能可以做到这一点。
Joe Clay

54
甚至没有接近的副本。vue.js是一个具有特定逻辑的框架,与vanila javascript不同
Yerko Palma

13
没有vue-router,如何做到这一点?
康纳·里奇

Answers:


343

根据route object的文档,您可以$route从组件中访问一个对象,该对象暴露了您的需求。在这种情况下

//from your component
console.log(this.$route.query.test) // outputs 'yay'

7
对!如果他没有使用vue-router,那确实是重复的,因为他将需要使用标准的JS方法。
杰夫

1
我只是假设,因为同一用户在发布有关vue-router的问题之前发布了信息,所以如果我有信誉的话,我将创建vue-router标签
Yerko Palma

2
好点子!我继续创建vue-router标签并添加了标签。
杰夫

问题在于,vue文档认为将组件耦合到路由器是不希望的。他们建议传递道具,但似乎不可能动态传递查询参数作为道具。例如,在一个beforeEach卫队中,做类似的事情是 return next({ name: 'login', query:{param1: "foo" }, });行不通的。在登录组件内部,道具param1未定义。
hraynaud

45

如果没有vue-route,请分割网址

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(){
  },

另一个解决方案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(){
  },

2
location.href当有location.search现成的东西时,您为什么要分裂自己?developer.mozilla.org/zh-CN/docs/Web/API/…例如,var querypairs = window.location.search.substr(1).split('&');用“ =”分隔查询名称/值对也不总是可行,因为您也可以传递没有值的命名查询参数。例如,?par1=15&par2您的代码现在将在par2上引发异常,因为用'='分割将导致tmp仅包含1个元素。
亚瑟

1
对不起,不会抛出异常,但是您也不会捕获par2。正如您基本上分配undefinedgetVars['par2']
亚瑟

GET方法是一个字符串(名称/值对),位于URL中
erajuan '18

@Arthur你是对的,我添加了验证并添加了另一个解决方案。谢谢
erajuan

37

帮助VueJS的新手的更详细的答案:

  • 首先定义您的路由器对象,选择您认为合适的模式。您可以在路线列表中声明路线。
  • 接下来,您希望您的主应用知道路由器的存在,因此请在主应用声明中声明它。
  • 最后,它们的$ route实例包含有关当前路由的所有信息。该代码将只记录在url中传递的参数的控制台日志。(* Mounted类似于document.ready,即应用程序就绪后即被调用。)

和代码本身:

<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)
    },
});

7
请解释一下
穆罕默德·穆阿扎姆

首先定义您的路由器对象,选择您认为合适的模式。您可以在路由列表中声明路由。接下来,您希望您的主应用知道路由器的存在,因此请在主应用声明中声明它。最后,它们的$ route实例包含有关当前路由的所有信息。我的代码将只记录在url中传递的参数的控制台日志。(* Mounted类似于document.ready,即在应用程序就绪后即被调用。)
Sabyasachi

3
对于更无知的新手:VueRouter不包含在VueJS核心中,因此您可能希望单独包含VueRouter:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi编辑您的答案,并在帖子本身中添加该信息。
西蒙·佛斯伯格

1
new Vue({ router, ... })是无效的语法。
Crescent Fresh

17

另一种方式(假设您正在使用vue-router)是将查询参数映射到路由器中的prop。然后,您可以像对待组件代码中的其他任何道具一样对待它。例如,添加此路线;

{ 
    path: '/mypage', 
    name: 'mypage', 
    component: MyPage, 
    props: (route) => ({ foo: route.query.foo })  
}

然后,可以在组件中正常添加道具。

props: {
    foo: {
        type: String,
        default: null
    }
},

然后它将可用this.foo,您可以用它做任何您想做的事情(例如设置观察者等)。


这很棒。谜题缺少的部分是启动。您可以这样做:`this。$ router.push({name:'mypage',query:{foo:'bar'})'
slf

7

截至目前,根据动态路由文档的正确方法是:

this.$route.params.yourProperty

代替

this.$route.query.yourProperty

3
它们不是同一件事!您应该用来query从URL获取查询。来自文档:除了$ route.params,$ route对象还公开了其他有用的信息,例如$ route.query(如果URL中存在查询)
Hatef

感谢您的澄清:)
Marco

2

你可以使用vue-router,下面是一个例子:

网址: 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()
  }
})

注意:beforeRouteEnter函数中我们无法访问组件的属性,例如:this.propertyName。这就是为什么我传递了vmto next函数。这是访问vue实例的推荐方式。vm实际上,它代表vue实例



1

如果您的网址看起来像这样:

somesite.com/something/123

其中“ 123”是名为“ id”的参数(网址类似于/ something /:id),请尝试以下操作:

this.$route.params.id

-6

如果您的服务器使用php,则可以执行以下操作:

const from = '<?php echo $_GET["from"];?>';

正常工作。


2
问题是如何用Vue而不是PHP做某事。
robertmain
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.