ChatGPT解决这个技术问题 Extra ChatGPT

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

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

例如

http://somesite.com?test=yay

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

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

M
Mike

根据 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" }, }); 之类的操作是行不通的。在登录组件中,道具 param1 未定义。
不幸的是,这仅适用于哈希部分(URL 片段)中的 URL 查询参数,而不是像 OP 那样作为示例给出的普通旧查询参数。这是 OP 的正确答案,恕我直言:stackoverflow.com/a/52587655/79485
K
Kai - Kazuya Ito

没有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 个元素。
抱歉不会抛出异常,但您也不会捕获 par2。因为您基本上将 undefined 分配给 getVars['par2']
GET 方法是一个字符串(名称/值对),在 URL 中
@Arthur你是对的,我添加了一个验证,我添加了另一个解决方案。谢谢你
.substring(1) 似乎是不必要的
K
Kai - Kazuya Ito

试试这个代码

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。
URLSearchParams 是一种纯 javascript 方法,它不是 vuejs 助手。
@mrded 既然已经使用了 Vue 和显然 Vue Router,为什么这种方法更好?
@Igor,因为它是一种 JS 原生方式,并且可以在任何地方使用。 Vue Router 只是一个不必要的抽象。
在 vue CDN => index.html?youParams=xxx 上工作
Y
YakovL

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

对于更无知的新手:VueRouter 不包含在 VueJS 核心中,因此您可能希望单独包含 VueRouter:<script src="https://unpkg.com/vue-router"></script>
@Sabyasachi 编辑您的答案并将该信息添加到帖子本身中。
new Vue({ router, ... }) 不是有效的语法。
该脚本有部分 ES6 使用,我认为这对新手来说是最糟糕的。要么使用适当的变量 decleration 和箭头函数去完整的 ES6,要么使用传统的方式。
@CrescentFresh new Vue({ router, ... }) 是 ES6 中的简写。在普通的 javascript 中是 new Vue({ 'router': router, ... })
K
Kai - Kazuya Ito

另一种方法(假设您使用 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' })`
这是最好的解决方案。这应该在顶部。根据我的意见,这应该被列为最佳实践。
同意,这应该是公认的答案。 @Rob,您尚未接受答案-您会接受吗?
d
doppelgreener

截至目前,正确的方法 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' },url /user/123?a=b&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 版本的文档在哪里。你看到很多人都投了赞成票,所以在某些时候它是这样工作的。
A
Alexandr

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)
那行得通,谢谢!
三个带有自定义导入的替代方案,而不是简单的“this.$route.query.test”
N
NobodySomewhere

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

somesite.com/something/123

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

this.$route.params.id

K
Kai - Kazuya Ito

你可以使用 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。这就是我将 vm 传递给 next 函数的原因。这是访问 vue 的推荐方式instance.其实 vm 它代表 vue 实例


在带有链接 site.com/route?query=test 的最新 Laravel + Vue 设置中,当通过 beforeRouteEnter(to, from, next) 方法中的 to 参数访问时,query 参数返回 undefined。任何想法为什么会这样?
d
dexcell

如果您将 vue-router 与 vue3 组合 api 一起使用,请执行以下操作

import { useRoute } from 'vue-router'

export default {
  setup() {
    const route = useRoute()
    console.log(route.query)
  }
}

d
duyuanchao

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

下面的代码输出:1439990638887137282

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

M
Muhammad

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


r
revati raman

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

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

重复的答案,仅在您使用 vue-router 时有效