Làm cách nào tôi có thể nhận được các tham số truy vấn từ một URL trong Vue.js?


249

Làm cách nào tôi có thể tìm nạp các tham số truy vấn trong Vue.js?

Ví dụ http://somesite.com?test=yay.

Không thể tìm cách tìm nạp hoặc tôi cần sử dụng JS thuần túy hoặc một số thư viện cho việc này?


5
Tại sao điều này được bỏ phiếu? Tôi cần nó cho Vue.js. Nếu có một số thư viện vue hoặc một cái gì đó được xây dựng trong nó sẽ được ưu tiên hơn js thô.
Rob

Có lẽ có một cái gì đó trong Vue Router làm điều đó, nếu bạn đang sử dụng nó.
Joe Clay

54
Thậm chí không có một bản sao. vue.js là một khung công tác với logic cụ thể, khác với vanila javascript
Yerko Palma

13
Làm thế nào điều này có thể được thực hiện mà không có bộ định tuyến vue?
Connor Leech

Câu trả lời:


344

Theo các tài liệu của đối tượng tuyến đường , bạn có quyền truy cập vào một $routeđối tượng từ các thành phần của mình, điều này phơi bày những gì bạn cần. Trong trường hợp này

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

8
Vâng Nếu anh ta không sử dụng vue-routerhơn thì đây thực sự sẽ là một bản sao, vì anh ta sẽ cần sử dụng các phương thức JS tiêu chuẩn.
Jeff

1
Tôi chỉ cho rằng vì cùng một người dùng đăng tải ngay trước một câu hỏi về vue-router, tôi sẽ tạo ra thẻ vue-router nếu tôi đã có uy tín để làm điều đó
Yerko Palma

2
điểm tốt! Tôi đã đi trước và tạo ra các vue-routerthẻ và thêm nó.
Jeff

Vấn đề là tài liệu vue coi các thành phần ghép nối với bộ định tuyến là không mong muốn. Họ khuyên bạn nên chuyển các đạo cụ nhưng dường như không thể chuyển các thông số truy vấn một cách linh hoạt như các đạo cụ. Ví dụ: trong một bảo vệ trước Mỗi người làm một việc như return next({ name: 'login', query:{param1: "foo" }, });không hoạt động. bên trong thành phần đăng nhập prop param1không xác định.
hraynaud

45

Nếu không có vue-route, hãy tách 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(){
  },

Một giải pháp khác https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkEuityUtils/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
Tại sao bạn lại location.hreftự chia tay khi có location.searchsẵn? developer.mozilla.org/en-US/docs/Web/API/, vd: var querypairs = window.location.search.substr(1).split('&');Cũng chia tách các cặp tên-giá trị truy vấn bởi '=' sẽ không luôn hoạt động vì bạn cũng có thể chuyển các tham số truy vấn có tên mà không có giá trị; ví dụ: ?par1=15&par2Mã của bạn bây giờ sẽ đưa ra một ngoại lệ trên par2 khi chia tách bởi '=' sẽ dẫn đến tmp chỉ có 1 phần tử.
Arthur

1
Xin lỗi sẽ không ném ngoại lệ nhưng bạn cũng sẽ không bắt được par2. Như bạn cơ bản chỉ định undefinedcho getVars['par2'].
Arthur

phương thức GET là một chuỗi (cặp tên / giá trị), trong URL
agejuan

@Arthur bạn nói đúng, tôi đã thêm một xác nhận và tôi đã thêm một giải pháp khác. cảm ơn bạn
agejuan

37

Câu trả lời chi tiết hơn để giúp những người mới của VueJS:

  • Đầu tiên xác định đối tượng bộ định tuyến của bạn, chọn chế độ bạn có vẻ phù hợp. Bạn có thể khai báo các tuyến đường của bạn trong danh sách các tuyến đường.
  • Tiếp theo, bạn sẽ muốn ứng dụng chính của mình biết bộ định tuyến tồn tại, vì vậy hãy khai báo nó bên trong khai báo ứng dụng chính.
  • Cuối cùng, ví dụ $ route chứa tất cả thông tin về tuyến đường hiện tại. Mã sẽ điều khiển đăng nhập chỉ tham số được truyền trong url. (* Được gắn kết tương tự như document. Yet, .ie được gọi ngay khi ứng dụng sẵn sàng)

Và bản thân mã:

<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
Hãy giải thích nó
Muhammad Muazzam

Trước tiên, xác định đối tượng bộ định tuyến của bạn, chọn chế độ bạn có vẻ phù hợp. Bạn có thể khai báo các tuyến đường của mình trong danh sách tuyến đường. Tiếp theo, bạn sẽ muốn ứng dụng chính của mình biết bộ định tuyến tồn tại, vì vậy hãy khai báo nó bên trong khai báo ứng dụng chính. Cuối cùng, ví dụ $ route chứa tất cả thông tin về tuyến đường hiện tại. Mã của tôi sẽ điều khiển đăng nhập chỉ tham số được truyền trong url. (* Được gắn kết tương tự như document. Yet, .ie được gọi ngay khi ứng dụng sẵn sàng)
Sabyasachi

3
Đối với những người mới thậm chí không biết gì: VueRouter không được bao gồm trong lõi VueJS, vì vậy bạn có thể muốn bao gồm riêng VueRouter:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi Chỉnh sửa câu trả lời của bạn và thêm thông tin đó trong chính bài đăng.
Simon Forsberg

1
new Vue({ router, ... })không phải là cú pháp hợp lệ.
Lưỡi liềm tươi

17

Một cách khác (giả sử bạn đang sử dụng vue-router), là ánh xạ thông số truy vấn tới chỗ dựa trong bộ định tuyến của bạn. Sau đó, bạn có thể coi nó như bất kỳ chỗ dựa nào khác trong mã thành phần của bạn. Ví dụ: thêm tuyến đường này;

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

Sau đó, trong thành phần của bạn, bạn có thể thêm prop như bình thường;

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

Sau đó, nó sẽ có sẵn this.foovà bạn có thể làm bất cứ điều gì bạn muốn với nó (như đặt một người theo dõi, v.v.)


Điều đó thật tuyệt. Phần còn thiếu của câu đố là sự khởi đầu. Bạn có thể làm như thế này: `this. $ Router.push ({name: 'mypage', truy vấn: {foo: 'bar'})`
slf

7

Kể từ ngày này, cách chính xác theo các tài liệu định tuyến động là:

this.$route.params.yourProperty

thay vì

this.$route.query.yourProperty

3
Chúng không giống nhau! Bạn nên sử dụng queryđể lấy các truy vấn từ URL. Từ các tài liệu: Ngoài $ route.params, đối tượng $ route còn hiển thị các thông tin hữu ích khác như $ route.query (nếu có một truy vấn trong URL)
ghétf

Cảm ơn đã làm rõ :)
Marco

2

Bạn có thể sử dụng vue-router. Tôi có một ví dụ dưới đây:

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

Lưu ý: Trong beforeRouteEnterchức năng, chúng tôi không thể truy cập thuộc tính của thành phần như: this.propertyNameVững lý do tại sao tôi có vượt qua vmđể nextfunction.It là cách recommented để truy cập các vue instance.Actually sự vmnó là viết tắt ví dụ vue


1

Bạn có thể nhận được bằng cách sử dụng chức năng này.

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

1

Nếu url của bạn trông giống như thế này:

somesite.com/something/123

Trong đó '123' là một tham số có tên 'id' (url like / Something /: id), hãy thử với:

this.$route.params.id

-6

Nếu máy chủ của bạn sử dụng php, bạn có thể làm điều này:

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

Chỉ cần làm việc.


2
Câu hỏi là làm thế nào để làm một cái gì đó với Vue, không phải với PHP.
robertmain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.