Vue.jsのURLからクエリパラメータを取得するにはどうすればよいですか?


251

Vue.jsでクエリパラメータをフェッチするにはどうすればよいですか?

例えばhttp://somesite.com?test=yay

フェッチする方法が見つからない、または純粋なJSまたはこのためのライブラリを使用する必要がありますか?


5
なぜこれは反対票が投じられるのですか?Vue.jsに必要です。何らかのvueライブラリまたは何かが組み込まれている場合、それはraw jsよりも優先されます。
Rob

あなたがそれを使用している場合、おそらくそれを行うVueルーターに何かがあるでしょう。
Joe Clay

54
複製に近いものすらありません。vue.jsは特定のロジックを備えたフレームワークであり、vanila javascriptとは異なります
Palma

13
Vue-Routerなしでこれをどのように達成できますか?
コナーリーチ2017

回答:


345

ルートオブジェクトのドキュメントによると、$routeコンポーネントからオブジェクトにアクセスでき、必要なものを公開します。この場合

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

8
うん!彼がvue-router標準のJSメソッドを使用する必要があるため、彼がこれよりも使用していない場合は、実際には重複します。
Jeff

1
同じユーザーがvue-routerに関する質問の直前に投稿したので、評判が良ければvue-routerタグを作成すると思います
Yerko Palma

2
いい視点ね!私は先に進み、vue-routerタグを作成して追加しました。
Jeff

問題は、vueのドキュメントで、コンポーネントをルーターに結合することは望ましくないと見なされていることです。小道具を渡すことをお勧めしますが、クエリのパラメーターを小道具として動的に渡すことはできません。たとえばbeforeEachガードでは、次のようなこと return next({ name: 'login', query:{param1: "foo" }, });は機能しません。ログインコンポーネント内では、prop 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、 '='で分割すると要素が1つだけのtmpになるため、コードでpar2に例外が発生します。
アーサー

1
申し訳ありませんが例外をスローしませんが、par2もキャッチしません。あなたは基本的に割り当てるようundefinedgetVars['par2']
Arthur

GETメソッドはURL内の文字列(名前と値のペア)です
erajuan

@アーサー、正解です。検証を追加し、別のソリューションを追加しました。ありがとう
erajuan

37

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

7
説明してください
Muhammad Muazzam

まずルーターオブジェクトを定義し、適切と思われるモードを選択します。ルートリスト内でルートを宣言できます。次に、メインアプリにルーターの存在を認識させたいので、メインアプリ宣言の中で宣言します。最後に、$ routeインスタンスは現在のルートに関するすべての情報を保持します。私のコードは、URLで渡されたパラメーターのみをコンソールログに記録します。(* Mountedはdocument.readyに似ています。つまり、アプリの準備ができるとすぐに呼び出されます)
Sabyasachi

3
さらに無知な初心者向け:VueRouterはVueJSコアに含まれていないため、VueRouterを個別に含めることをお勧めします:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi回答を編集して、その情報を投稿自体に追加します。
Simon Forsberg

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
それらは同じものではありません!queryURLからクエリを取得するには、を使用する必要があります。(URLのクエリがある場合)$ route.paramsに加えて、$ルートオブジェクトはまた、$ route.queryなど他の有用な情報を公開:ドキュメントから
hatef

説明をありがとう:)
Marco

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私は渡す持っている理由.Thatさんvmnextfunction.ItはVUEがinstance.Actuallyアクセスにrecommented方法ですvm、それはVUEのインスタンスを表します


2

あなたのURLがこのようなものなら:

somesite.com/something/123

'123'は 'id'という名前のパラメーター(/ something /:idのようなURL)ですが、次のように試してください:

this.$route.params.id


-6

サーバーがphpを使用している場合、これを行うことができます。

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

うまくいきます。


2
問題は、PHPではなく、Vueで何かを行う方法でした。
robertmain
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.