Vue.js查询参数

Rob*_*Rob 177 javascript url-parameters vue.js vue-router

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

__PRE__

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

Yer*_*lma 254

根据route对象的文档,您可以访问$route组件中的对象,从而显示您需要的对象.在这种情况下

//from your component
console.log(this.$route.query.test) // outputs 'yay'
Run Code Online (Sandbox Code Playgroud)

  • 对!如果他不使用`vue-router`,那么这确实是重复的,因为他需要使用标准的JS方法. (4认同)
  • 不幸的是,这仅适用于哈希部分(URL 片段)内的 URL 查询参数,而不是像 OP 所给出的示例那样的普通旧查询参数。这是OP的正确答案,恕我直言:/sf/answers/3681135881/ (3认同)
  • 我只是假设因为同一个用户在关于 vue-router 的问题之前发布了,如果我有这样做的声誉,我会创建 vue-router 标签 (2认同)
  • 好点子!我继续创建了`vue-router`标签并添加了它。 (2认同)

Sab*_*i 35

更详细的答案,以帮助VueJs的新手.

<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)
    },
});
Run Code Online (Sandbox Code Playgroud)

  • 请解释一下 (7认同)
  • 对于更多无知的新手:VueRouter不包含在VueJS核心中,因此您可能希望单独包含VueRouter:`<script src ="https://unpkg.com/vue-router"> </ script>` (3认同)
  • @Sabyasachi编辑您的答案,并在帖子本身中添加该信息。 (2认同)

era*_*uan 34

如果没有vue-route,请拆分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(){
  },
Run Code Online (Sandbox Code Playgroud)

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

  • 抱歉不会抛出异常,但你也不会赶上 par2。因为你基本上将 `undefined` 分配给 `getVars['par2']`。 (3认同)
  • 当容易获得“ location.search”时,为什么要自己拆分“ location.href”?https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLHyperlinkElementUtils/search,例如“ var querypairs = window.location.search.substr(1).split('&');`也将用“ =”查询名称/值对并不总是可行,因为您也可以传递没有值的命名查询参数。例如`?par1 = 15&par2`您的代码现在将在par2上引发异常,因为用'='分割将导致tmp仅包含1个元素。 (2认同)

Cor*_*ter 31

试试这个代码

 var vm = new Vue({
     created()
     {
       let urlParams = new URLSearchParams(window.location.search);
           console.log(urlParams.has('yourParam')); // true
           console.log(urlParams.get('yourParam')); // "MyParam"
     },
Run Code Online (Sandbox Code Playgroud)

  • 绝对优雅的答案。谢谢!当然没有 vue-router。 (4认同)
  • @Igor,因为它是 JS 原生方式,并且可以在任何地方使用。Vue Router 只是一个不必要的抽象。 (2认同)

Mar*_*rco 16

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

this.$route.params.yourProperty
Run Code Online (Sandbox Code Playgroud)

代替

this.$route.query.yourProperty
Run Code Online (Sandbox Code Playgroud)

  • 它们不是同一件事!您应该使用“query”从 URL 获取查询。来自文档:除了 $route.params 之外,$route 对象还公开其他有用的信息,例如 $route.query(如果 URL 中有查询) (7认同)
  • 你的答案是错误的,这不是“正确的方法”。解释一下,使用 `{ path: '/user/:id' }` 时,url `/user/123?a=b&amp;c=d` 将具有 `$route.params == { id: "123" } ` 和 `$route.query == { a: "b", c: "d" }`。 (3认同)

Mik*_*e P 15

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

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

然后在您的组件中,您可以正常添加道具;

props: {
    foo: {
        type: String,
        default: null
    }
},
Run Code Online (Sandbox Code Playgroud)

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

  • 这很棒。拼图中缺失的部分是启动。你可以这样做: ` this.$router.push({ name: 'mypage', query: { foo: 'bar' })` (3认同)

Ale*_*ndr 8

Vue 3 组合 API

(截至目前 2021,vue-router 4)

import {useRouter} from "vue-router";

//can use only in setup()
useRoute().query.test
Run Code Online (Sandbox Code Playgroud)

或者

//somewhere in your src files
import router from "~/router";

//can use everywhere 
router.currentRoute.value.query.test  
Run Code Online (Sandbox Code Playgroud)

或者

import {useRouter} from "vue-router";

//can use only in setup()
useRouter().currentRoute.value.query.test
Run Code Online (Sandbox Code Playgroud)


rol*_*oli 6

你可以使用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();
  }
})
Run Code Online (Sandbox Code Playgroud)

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


Nob*_*ere 6

如果您的网址如下所示:

somesite.com/something/123
Run Code Online (Sandbox Code Playgroud)

其中 '123' 是一个名为 'id' 的参数(网址如 /something/:id),请尝试:

this.$route.params.id
Run Code Online (Sandbox Code Playgroud)


dex*_*ell 6

如果您使用vue-routervue3 组合 api,这里是如何执行此操作

import { useRoute } from 'vue-router'

export default {
  setup() {
    const route = useRoute()
    console.log(route.query)
  }
}
Run Code Online (Sandbox Code Playgroud)