Come posso ottenere parametri di query da un URL in Vue.js?


251

Come posso recuperare i parametri della query in Vue.js?

Es http://somesite.com?test=yay.

Non riesci a trovare un modo per recuperare o devo usare JS puro o qualche libreria per questo?


5
Perché si sta votando? Ne ho bisogno per Vue.js. Se c'è qualche libreria Vue o qualcosa incorporato, sarebbe preferibile rispetto a js raw.
Rob

Probabilmente c'è qualcosa in Vue Router che lo fa, se lo stai usando.
Joe Clay

54
Non c'è nemmeno vicino a un duplicato. vue.js è un framework con una logica specifica, diversa da vanila javascript
Yerko Palma

13
Come è possibile farlo senza Vue-router?
Connor Leech,

Risposte:


345

Secondo i documenti dell'oggetto route , hai accesso a un $routeoggetto dai tuoi componenti, che espongono ciò di cui hai bisogno. In questo caso

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

8
Sì! Se non lo utilizza, vue-routersarebbe davvero un duplicato, poiché dovrà utilizzare i metodi JS standard.
Jeff

1
Suppongo solo che, poiché lo stesso utente ha pubblicato poco prima di una domanda su Vue-router,
creerei il

2
buon punto! Sono andato avanti e ho creato il vue-routertag e l'ho aggiunto.
Jeff

Il problema è che la documentazione di Vue considera indesiderabile l'accoppiamento dei componenti al router. Raccomandano di passare oggetti di scena ma non sembra possibile passare parametri di query dinamicamente come oggetti di scena. Ad esempio in un precedente Ogni guardia che fa qualcosa di simile return next({ name: 'login', query:{param1: "foo" }, });non funziona. all'interno del componente login l'elica param1non è definita.
Hraynaud,

45

Senza vue-route, dividi l'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(){
  },

Un'altra soluzione 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
Perché dovresti location.hrefdividerti quando è location.searchprontamente disponibile? developer.mozilla.org/en-US/docs/Web/API/… es. var querypairs = window.location.search.substr(1).split('&');Anche la suddivisione delle coppie nome-valore della query per '=' non funzionerà sempre poiché è possibile passare parametri di query denominati anche senza valore; es. ?par1=15&par2Il tuo codice ora genererebbe un'eccezione su par2 poiché la divisione per '=' si tradurrà in tmp con solo 1 elemento.
Arthur,

1
Siamo spiacenti, non avresti generato un'eccezione ma non avresti nemmeno catturato il par2. Come praticamente assegni undefineda getVars['par2'].
Arthur,

il metodo GET è una stringa (coppie nome / valore), nell'URL
erajuan

@Arthur hai ragione, ho aggiunto una validazione e ho aggiunto un'altra soluzione. grazie
erajuan

37

Risposta più dettagliata per aiutare i neofiti di VueJS:

  • Per prima cosa definisci l'oggetto router, seleziona la modalità che ritieni adatta. Puoi dichiarare i tuoi percorsi all'interno dell'elenco dei percorsi.
  • Successivamente vorrai che la tua app principale sappia che esiste il router, quindi dichiaralo nella dichiarazione dell'app principale.
  • Infine, l'istanza $ route contiene tutte le informazioni sulla rotta corrente. Il codice conserverà il log solo del parametro passato nell'URL. (* Montato è simile a document.ready, .ie viene chiamato non appena l'app è pronta)

E il codice stesso:

<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
Per favore, spiegalo
Muhammad Muazzam,

Per prima cosa definisci l'oggetto del router, seleziona la modalità che ritieni adatta. Puoi dichiarare i tuoi percorsi all'interno dell'elenco dei percorsi. Successivamente vorrai che la tua app principale sappia che esiste il router, quindi dichiaralo all'interno della dichiarazione dell'app principale. Infine, l'istanza $ route contiene tutte le informazioni sulla rotta corrente. Il mio codice consolerà il registro solo il parametro passato nell'URL. (* Montato è simile a document.ready, .ie viene chiamato non appena l'app è pronta)
Sabyasachi,

3
Per i principianti ancora più all'oscuro: VueRouter non è incluso nel core di VueJS, quindi potresti voler includere il VueRouter separatamente:<script src="https://unpkg.com/vue-router"></script>
Rustyx,

2
@Sabyasachi Modifica la tua risposta e aggiungi quelle informazioni nel post stesso.
Simon Forsberg,

1
new Vue({ router, ... })non è una sintassi valida.
Crescent Fresh,

17

Un altro modo (supponendo che tu stia utilizzando vue-router) è mappare il parametro della query su un oggetto nel tuo router. Quindi puoi trattarlo come qualsiasi altro oggetto nel tuo codice componente. Ad esempio, aggiungi questo percorso;

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

Quindi nel tuo componente puoi aggiungere l'elica normalmente;

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

Quindi sarà disponibile come this.fooe puoi fare tutto quello che vuoi (come impostare un osservatore, ecc.)


Questo è fantastico Il pezzo mancante del puzzle è l'iniziazione. Puoi farlo in questo modo: `this. $ Router.push ({name: 'mypage', query: {foo: 'bar'})`
slf

7

A partire da questa data, il modo corretto secondo i documenti di routing dinamico è:

this.$route.params.yourProperty

invece di

this.$route.query.yourProperty

3
Non sono la stessa cosa! È necessario utilizzare queryper ottenere le query dall'URL. Dai documenti: oltre a $ route.params, l'oggetto $ route espone anche altre informazioni utili come $ route.query (se c'è una query nell'URL)
hatef

Grazie per il chiarimento :)
Marco,

2

Puoi usare vue-router. Ho un esempio qui sotto:

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

Nota: in beforeRouteEnterfunzione non possiamo accedere alle proprietà del componente come:. this.propertyNameEcco perché ho passato la funzione vmto. nextÈ il modo consigliato per accedere all'istanza di Vue. In vmrealtà, sta per istanza di Vue


2

Se l'URL è simile al seguente:

somesite.com/something/123

Dove '123' è un parametro chiamato 'id' (url like / qualcosa /: id), prova con:

this.$route.params.id

1

È possibile ottenere utilizzando questa funzione.

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

-7

Se il tuo server utilizza php, puoi farlo:

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

Funziona e basta.


4
La domanda era come fare qualcosa con Vue, non con PHP.
robertmain
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.