【问题标题】:如何从 Vue.js 中的 URL 获取查询参数?
【发布时间】:2016-06-25 03:42:40
【问题描述】:

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

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

找不到获取方法,还是我需要使用纯 JS 或某些库来获取?

【问题讨论】:

  • 为什么会被否决?我需要它用于 Vue.js。如果有一些 vue 库或内置的东西,它会比原始 js 更受欢迎。
  • 甚至没有接近副本。 vue.js是一个有特定逻辑的框架,不同于vanila javascript
  • 没有vue-router怎么办?

标签: javascript vue.js vue-router url-parameters


【解决方案1】:

根据route object 的文档,您可以从您的组件中访问$route 对象,该对象公开您需要的内容。在这种情况下

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

【讨论】:

  • 是的!如果他没有使用vue-router,那么这确实是重复的,因为他需要使用标准的 JS 方法。
  • 我只是假设因为同一个用户在一个关于 vue-router 的问题之前发布,如果我有这样做的声誉,我会创建 vue-router 标签
  • 好点!我继续创建了vue-router 标签并添加了它。
  • 问题在于 vue 文档认为将组件耦合到路由器是不可取的。他们建议传递道具,但似乎不可能将查询参数作为道具动态传递。例如,在 beforeEach 守卫中做类似return next({ name: 'login', query:{param1: "foo" }, }); 的事情是行不通的。在登录组件中,prop param1 未定义。
  • 不幸的是,这仅适用于散列部分(URL 片段)中的 URL 查询参数,而不是像 OP 举例说明的普通旧查询参数。这是 OP 的正确答案,恕我直言:stackoverflow.com/a/52587655/79485
【解决方案2】:

不使用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() {
  },
....

另一种解决方案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.search 随时​​可用时,您为什么要自己拆分location.hrefdeveloper.mozilla.org/en-US/docs/Web/API/… 例如var querypairs = window.location.search.substr(1).split('&'); 同样,通过“=”分割查询名称-值对并不总是有效,因为您也可以传递没有值的命名查询参数;例如?par1=15&par2 您的代码现在会在 par2 上引发异常,因为用 '=' 分割将导致 tmp 只有 1 个元素。
  • Sorry 不会抛出异常,但你也不会捕获 par2。正如您基本上将undefined 分配给getVars['par2']
  • GET 方法是一个字符串(名称/值对),在 URL 中
  • @Arthur 你是对的,我添加了验证并添加了另一个解决方案。谢谢
  • .substring(1) 好像没必要
【解决方案3】:

试试这个代码

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

【讨论】:

  • 绝对优雅的答案。谢谢!当然没有 vue-router。
  • 感谢您向我展示创建的内容!这正是我想要的。
  • 谢谢纠正者!,这是不用usign vue路由器的正确方法,帮了我很多!
  • URLSearchParams 是一种纯 javascript 方法,它不是 vuejs 助手。
  • 到目前为止我最喜欢的方法
【解决方案4】:

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

【讨论】:

  • 请解释一下
  • 首先定义你的路由对象,选择你觉得合适的模式。你可以在路由列表中声明你的路由。接下来,您希望您的主应用程序知道路由器存在,因此在主应用程序声明中声明它。最后,它们 $route 实例保存了有关当前路线的所有信息。我的代码将仅记录在 url 中传递的参数。 (*Mounted 类似于 document.ready ,即在应用程序准备好后立即调用)
  • 对于更无知的新手:VueRouter 不包含在 VueJS 核心中,因此您可能希望单独包含 VueRouter:&lt;script src="https://unpkg.com/vue-router"&gt;&lt;/script&gt;
  • @Sabyasachi 编辑您的答案并将该信息添加到帖子本身中。
  • new Vue({ router, ... }) 语法无效。
【解决方案5】:

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

{ 
  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' })`
  • 这是最好的解决方案。这应该在顶部。根据我的意见,这应该被列为最佳实践。
【解决方案6】:

截至目前,according to the dynamic routing docs 的正确方式是:

this.$route.params.yourProperty

而不是

this.$route.query.yourProperty

【讨论】:

  • 它们不是一回事!您应该使用 query 从 URL 获取查询。来自文档:除了 $route.params,$route 对象还公开了其他有用的信息,例如 $route.query(如果 URL 中有查询)
  • 你的答案是错误的,这不是“正确的方法”。稍微解释一下,使用{ path: '/user/:id' },网址/user/123?a=b&amp;c=d 将有$route.params == { id: "123" }$route.query == { a: "b", c: "d" }
  • a 已经从 vue 链接了文档,所以如果你说我错了,那就是文档错了。
  • 我看到你在这里误解了一些东西params 表示你的URL 中的参数像/user/:username。您会看到usernameparamsquery params/search/?q='new Vue js' 类似,正如您所看到的,new Vue js 是此处的查询参数。文件中没有任何内容可以证明您的答案。请告诉我你看到的是文件的哪一行?
  • 当时 2.x 版本的文档在哪里。你看到很多人都投了赞成票,所以在某些时候它是这样工作的。
【解决方案7】:

Vue 3 组合 API

(截至 2021 年,vue-router 4)

import {useRoute} from "vue-router";

//can use only in setup()
useRoute().query.test

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

//can use everywhere 
router.currentRoute.value.query.test  

import {useRouter} from "vue-router";

//can use only in setup()
useRouter().currentRoute.value.query.test

【讨论】:

  • 仅供阅读,第一个导入语句应该是 import { useRoute } from "vue-router"
  • 我正在使用第三个示例。我在 setup() 中尝试 console.log(useRouter().currentRoute.value.query.test) 并收到错误:“injection "Symbol([vue-router]: router)" not found."。我安装了 vue-router@next 并导入了 useRouter...任何想法为什么会出现此错误?
  • @WillyBurb 好像你没有将 vue-router 注入 vue。回到文档,搜索 app.use(router)
  • 成功了,谢谢!
【解决方案8】:

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

somesite.com/something/123

其中 '123' 是一个名为 'id' 的参数(类似 /something/:id 的 URL),请尝试:

this.$route.params.id

【讨论】:

    【解决方案9】:

    你可以使用vue-router。我有一个例子如下:

    网址:www.example.com?name=john&amp;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。这就是为什么我将vm 传递给next 函数。这是推荐的方法访问vue实例。其实vm代表vue实例

    【讨论】:

    • 在最新的 Laravel + Vue 设置中,通过 beforeRouteEnter(to, from, next) 方法中的 to 参数访问时,query 参数返回 undefined。任何想法为什么会这样?
    【解决方案10】:

    如果您将vue-router 与 vue3 组合 api 一起使用,这里是如何做到的

    import { useRoute } from 'vue-router'
    
    export default {
      setup() {
        const route = useRoute()
        console.log(route.query)
      }
    }
    

    【讨论】:

      【解决方案11】:

      如果您使用哈希模式,请记住一件事,然后不要使用 this.$route.params.name 仅使用 url search param

      【讨论】:

        【解决方案12】:

        您可以通过使用此功能获得。

        console.log(this.$route.query.test)
        

        【讨论】:

        • 重复答案,仅在使用 vue-router 时有效
        【解决方案13】:

        示例网址:http://localhost:9528/#/course/outline/1439990638887137282

        以下代码输出:1439990638887137282

        this.courseId = this.$route.params.id
        console.log('courseId', this.courseId)
        

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 1970-01-01
          • 2019-03-06
          • 2018-07-22
          • 2023-02-21
          • 2018-05-07
          • 2016-06-11
          • 2018-05-29
          • 2021-05-20
          相关资源
          最近更新 更多