Як я можу отримати параметри запиту з URL-адреси у Vue.js?


251

Як я можу отримати параметри запиту у Vue.js?

Напр http://somesite.com?test=yay.

Не можете знайти спосіб отримати чи мені для цього потрібно використовувати чистий JS чи якусь бібліотеку?


5
Чому за це проголосують голоси? Мені це потрібно для Vue.js. Якщо є якась бібліотека vue або щось вбудоване в неї, було б кращим перед необробленими js.
Роб

Напевно, є щось у Vue Router, що це робить, якщо ви це використовуєте.
Джо Клей

54
Не існує навіть близько до дубліката. vue.js - це рамка з певною логікою, відмінна від vanila javascript
Yerko Palma

13
Як це можна досягти без vue-router?
Connor Leech

Відповіді:


345

Згідно з документами об’єкта маршруту , у вас є доступ до $routeоб'єкта зі своїх компонентів, які розкривають те, що вам потрібно. В цьому випадку

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

8
Так! Якщо він не використовує, vue-routerце справді буде дублікатом, оскільки йому потрібно буде використовувати стандартні методи JS.
Джефф

1
Я просто припускаю, що оскільки той самий користувач опублікував перед запитанням про vue-router, я створив би тег vue-router, якби мав це репутація
Yerko Palma

2
гарна думка! Я пішов вперед і створив vue-routerтег і додав його.
Джефф

Проблема полягає в тому, що документація vue вважає з'єднання компонентів з маршрутизатором небажаним. Вони рекомендують передавати реквізити, але, здається, неможливо передавати параметри запитів динамічно як реквізит. Наприклад, перед кожним охоронцем робити щось на кшталт return next({ name: 'login', query:{param1: "foo" }, });не працює. всередині компонента входу опора param1не визначена.
hraynaud

45

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

2
Чому б ви розділилися, location.hrefколи є в location.searchнаявності? developer.mozilla.org/en-US/docs/Web/API/…, наприклад, var querypairs = window.location.search.substr(1).split('&');також розділення пар імен-значень на запит на '=' не завжди буде працювати, оскільки ви також можете передавати іменовані параметри запиту без значення; Наприклад, ?par1=15&par2ваш код тепер створить виняток у par2, оскільки розщеплення на '=' призведе до tmp з лише 1 елементом.
Артур

1
Вибачте, не викинете виняток, але ви також не піймаєте пар2. Як ви в основному призначити undefinedв getVars['par2'].
Артур

метод GET - це рядок (пари імен / значення), в URL
erajuan

@Arthur, ти маєш рацію, я додав валідацію та додав інші рішення. дякую
erajuan

37

Більш детальна відповідь, щоб допомогти новачкам VueJS:

  • Спочатку визначте об’єкт маршрутизатора, виберіть режим, який вам здається потрібним. Ви можете оголосити свої маршрути всередині списку маршрутів.
  • Далі ви хочете, щоб ваш основний додаток знав, що існує маршрутизатор, тому оголосити його всередині основної декларації програми.
  • Нарешті, вони екземпляр $ route зберігає всю інформацію про поточний маршрут. Код консолірує журнал лише параметру, переданого в URL-адресі. (* Монтаж схожий на 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)
    },
});

7
Поясніть, будь ласка,
Мухаммед Муазам

Спочатку визначте об’єкт маршрутизатора, виберіть режим, який вам здається потрібним. Ви можете оголосити свої маршрути всередині списку маршрутів. Далі ви хочете, щоб ваш основний додаток знав, що існує маршрутизатор, тому оголосити його всередині основної декларації програми. Нарешті, вони екземпляр $ route зберігає всю інформацію про поточний маршрут. Мій код буде консолювати журнал лише параметром, переданим в URL-адресі. (* Монтаж схожий на document.ready, .ie його викликають, як тільки програма буде готова)
Sabyasachi

3
Для ще більш неосвічених новачків: VueRouter не включений до ядра VueJS, тому ви можете включити VueRouter окремо:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi Відредагуйте свою відповідь та додайте цю інформацію до самої публікації.
Саймон Форсберг

1
new Vue({ router, ... })недійсний синтаксис.
Півмісяць свіжий

17

Інший спосіб (якщо припустити, що ви використовуєте 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'})`
slf

7

Станом на цю дату правильним способом згідно з документами про динамічну маршрутизацію є:

this.$route.params.yourProperty

замість

this.$route.query.yourProperty

3
Вони не одне і те ж! Ви повинні використовувати queryдля отримання запитів із URL-адреси. З Документів: Окрім $ route.params, об’єкт $ route також пропонує іншу корисну інформацію, таку як $ route.query (якщо в URL-адресі є запит)
hatef

Дякую за роз’яснення :)
Марко

2

Ви можете використовувати vue-router. У мене є приклад нижче:

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

Примітка: У beforeRouteEnterфункції ми не можемо отримати доступ до властивостями компоненти , як: this.propertyName.Т Ось чому я пройти vmдо nextfunction.It є recommented способом доступу до вю instance.Actually vmце означає вю , наприклад


2

Якщо ваша URL-адреса виглядає приблизно так:

somesite.com/something/123

Якщо '123' - це параметр з назвою 'id' (URL як / щось /: id), спробуйте:

this.$route.params.id


-6

Якщо ваш сервер використовує php, ви можете це зробити:

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

Просто працює.


2
Питання полягало в тому, як зробити щось з Vue, а не з PHP.
Робертман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.