Vue.js'deki bir URL'den sorgu parametrelerini nasıl alabilirim?


251

Vue.js'de sorgu parametrelerini nasıl alabilirim?

Örn http://somesite.com?test=yay.

Getirmenin bir yolunu bulamıyor veya bunun için saf JS veya kitaplık kullanmam gerekiyor mu?


5
Bu niçin iniyor? Vue.js için ihtiyacım var. Eğer bir vue kütüphanesi veya yerleşik bir şey varsa, ham js yerine tercih edilir.
Rob

Muhtemelen Vue Router'da bunu yapan bir şey var, eğer kullanıyorsanız.
Joe Clay

54
Bir kopyaya bile yakın değil. vue.js , vanila javascript'ten farklı, belirli bir mantığa sahip bir çerçevedir
Yerko Palma

13
Bu, vue-router olmadan nasıl yapılabilir?
Connor Leech

Yanıtlar:


345

Route nesnesinin belgelerine göre $route, bileşenlerinizden ihtiyacınız olan şeyi ortaya çıkaran bir nesneye erişebilirsiniz . Bu durumda

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

8
Evet! O kullanmıyorsa vue-routero standart JS yöntemleri kullanmak gerekecektir olarak gerçekten de yinelenen olacağını bundan daha.
Jeff

1
Ben sadece aynı kullanıcı vue-yönlendirici hakkında bir soru hemen önce gönderdi çünkü, bunu yapmak için bir üne sahip olsaydı vue-yönlendirici etiketi oluşturmak olacağını
varsayalım

2
iyi bir nokta! Devam ettim ve vue-routeretiketi oluşturup ekledim.
Jeff

Sorun, vue belgelerinin yönlendiriciye bağlantı bileşenlerini istenmeyen olarak görmesidir. Sahne geçmesini öneriyorlar ancak sorgu parametrelerini sahne olarak dinamik olarak geçirmek mümkün görünmüyor. Örneğin, her şeyden önce böyle bir şey yapmak return next({ name: 'login', query:{param1: "foo" }, });işe yaramaz. giriş bileşeninin içinde pervane param1tanımsızdır.
hraynaud

45

Vue-route olmadan URL'yi bölün

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

Başka bir çözüm 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
Neden ayrıldın location.hreflocation.searchHazır olduğunda kendinizi bölesiniz? developer.mozilla.org/tr-TR/docs/Web/API/… ör var querypairs = window.location.search.substr(1).split('&');. Sorgu adı-değer çiftlerini '=' ile bölmek de adlandırılmış sorgu parametrelerini değer olmadan da aktarabileceğiniz için her zaman çalışmaz; Örneğin, ?par1=15&par2kodunuz artık par2'de bir istisna oluşturacaktır çünkü '=' ile bölmek sadece 1 öğeyle tmp ile sonuçlanacaktır.
Arthur

1
Maalesef bir istisna atmazsınız ama par2'yi de yakalamazsınız. Temelde atadığınız gibiundefined gibi getVars['par2'].
Arthur

GET yöntemi URL'de bir dizedir (ad / değer çiftleri)
erajuan

@Arthur haklısın, bir doğrulama ekledim ve başka çözümler ekledim. thank you
erajuan

37

VueJS'in yeni başlayanlarına yardımcı olmak için daha ayrıntılı cevap:

  • Öncelikle yönlendirici nesnenizi tanımlayın, uygun gibi görünen modu seçin. Rotaları güzergahlar listesinde bildirebilirsiniz.
  • Daha sonra ana uygulamanızın yönlendiricinin var olduğunu bilmesini istersiniz, bu yüzden ana uygulama beyanında bildirin.
  • Son olarak $ route örneği geçerli rota hakkındaki tüm bilgileri tutar. Kod, yalnızca URL'ye iletilen parametreyi günlüğe kaydedecektir. (* Mounted, document.ready'e benzer, uygulama hazır olur olmaz çağrılır.)

Ve kodun kendisi:

<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
Lütfen açıklayın
Muhammed Muazzam

Öncelikle yönlendirici nesnenizi tanımlayın, uygun göründüğünüz modu seçin. Rotalar rota listesinde bildirebilirsiniz. Daha sonra ana uygulamanızın yönlendiricinin var olduğunu bilmesini istersiniz, bu yüzden ana uygulama beyanında bildirin. Son olarak $ route örneği geçerli rota hakkındaki tüm bilgileri tutar. Kodum yalnızca URL'ye iletilen parametreyi günlüğe kaydedecek. (* Atlı belge benzer. Zaten, .ie hazır olur hazır çağrılır)
Sabyasachi

3
Daha fazla clueless yeni başlayanlar için: VueRouter, VueJS çekirdeğine dahil değildir, bu nedenle VueRouter'ı ayrı olarak dahil etmek isteyebilirsiniz:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi Yanıtınızı düzenleyin ve bu bilgileri yayının içine ekleyin.
Simon Forsberg

1
new Vue({ router, ... })geçerli bir sözdizimi değil.
Crescent Fresh

17

Başka bir yol (kullandığınız varsayılarak vue-router), sorgu parametresini yönlendiricinizdeki bir pervane ile eşlemektir. Sonra bileşen kodunuzdaki diğer herhangi bir pervane gibi davranabilirsiniz. Örneğin, bu rotayı ekleyin;

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

Sonra bileşeninizde pervaneyi normal olarak ekleyebilirsiniz;

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

O zaman mevcut olacak this.foove onunla istediğiniz her şeyi yapabilirsiniz (bir gözlemci ayarlamak gibi)


Bu harika. Bulmacanın eksik parçası inisiyasyon. Bunu şu şekilde yapabilirsiniz: `this. $ Router.push ({name: 'mypage', sorgu: {foo: 'bar'}))
slf

7

Bu tarihten itibaren, dinamik yönlendirme belgelerine göre doğru yol :

this.$route.params.yourProperty

onun yerine

this.$route.query.yourProperty

3
Aynı şey değiller! queryURL'den sorgu almak için kullanmalısınız . Dokümanlar'dan: $ route.params'a ek olarak, $ route nesnesi de $ route.query (URL'de bir sorgu varsa) gibi diğer faydalı bilgileri ortaya çıkarır
hatef

Açıklama için teşekkürler :)
Marco

2

Vue-router'ı kullanabilirsiniz. Aşağıda bir örneğim var:

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

Not: In beforeRouteEnterbiz gibi bileşenin özelliklerini erişemez fonksiyonu: this.propertyNamei geçmesi neden .That en vmetmek nextfunction.It vue instance.Actually erişime recommented yoludur vmo vue örneğin standları


2

URL'niz şöyle görünüyorsa:

somesite.com/something/123

'123', 'id' adlı bir parametredir (url benzeri / bir şey:: id), şunu deneyin:

this.$route.params.id


-6

Sunucunuz php kullanıyorsa, bunu yapabilirsiniz:

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

Sadece çalışıyor.


2
Soru, PHP ile değil, Vue ile nasıl bir şey yapılacağıydı.
robertmain
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.