■ はじめに
https://dk521123.hatenablog.com/entry/2021/01/20/165026
の続き。 ページ間でのパラメータ渡す方法が複数あるようなので 今回は、様々な渡し方について、まとめる。 なお、以下が非常に参考になった。感謝。
目次
【1】動的ルートマッチング 【2】$route.query を使用した受け渡し 【3】$route.params を使用した受け渡し ※ props オプション での受け取り
【1】動的ルートマッチング
例えば、 ~~~~~~~~~~~~~~~~~~~~~~~~~~ http://localhost:8081/<PageName>/<Parameter(e.g. User ID etc)> ~~~~~~~~~~~~~~~~~~~~~~~~~~ のようにURLから値を設定して、 それをそのページから取得したい場合のやり方をメモする。
遷移先での値取得の仕方
~~~~~~~~~~~~~~ { path: '/<遷移先>/:id', <= 「:<Parameter Name>」で設定 name: '<遷移先>', component: <遷移先> }, ~~~~~~~~~~~~~~ で値を設定する /user/:username/post/:post_id(e.g. /user/evan/post/123) で複数も可能。
遷移先での値取得の仕方
~~~~~~~~~~~~~~ this.$route.params.<Parameter Name> ~~~~~~~~~~~~~~ で値を取得する
サンプル
/src/router/index.ts
import Vue from 'vue' import VueRouter, { RouteConfig } from 'vue-router' import Home from '../views/Home.vue' // ・・・略・・・ // ★追加 import DemoParam from '../views/DemoParam.vue' Vue.use(VueRouter) const routes: Array<RouteConfig> = [ { path: '/', name: 'Home', component: Home }, // ★追加 { path: '/DemoParam/:id', name: 'DemoParam', component: DemoParam }, // ・・・略・・・ ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
/src/views/DemoParam.vue (遷移先ページ)
<template> <div> <div>↓ここに値が表示される↓</div> <div>{{ this.$route.params.id }}</div> </div> </template> <script lang="ts"> import { Component, Vue } from "vue-property-decorator"; @Component export default class DemoParam extends Vue { } </script>
動作確認
npm run serve などでローカルサーバを起動したら
http://localhost:8081/DemoParam/00001
にアクセスする(「00001」が表示されたらOK)
参考文献
https://router.vuejs.org/ja/guide/essentials/dynamic-matching.html
https://forsmile.jp/vue/910/
【2】$route.query を使用した受け渡し
サンプル
Demo.vue
<template> <div class="home"> <div>{{ this.value1 }}</div> <div>{{ this.value2 }}</div> </div> </template> <script lang="ts"> import { Component, Vue } from 'vue-property-decorator'; @Component export default class Demo extends Vue { value1 = ''; value2 = ''; created() { this.value1 = this.$route.query.id.toString(); this.value2 = this.$route.query.name.toString(); } } </script>
動作確認
http://localhost:8080/Demo?id=001&name=Mike
でページ遷移すると、以下のように表示される ~~~~~ 001 Mike ~~~~~
【3】$route.params を使用した受け渡し
* 受け取るときは、 後述「※ props オプション での受け取り」のやり方がおすすめ
サンプル
Demo.vue
<template> <div class="home"> <div> Hello! <v-btn @click="move()">Move</v-btn> </div> </div> </template> <script lang="ts"> import { Component, Vue } from 'vue-property-decorator'; @Component export default class Demo extends Vue { move() { this.$router.push({ name: 'Demo2', params: { id: 'X000001', name: 'Mike and Tom', }, }); } } </script>
Demo2.vue
<template> <div class="home"> Hello!!! <div>{{ this.value1 }}</div> <div>{{ this.value2 }}</div> </div> </template> <script lang="ts"> import { Component, Vue } from 'vue-property-decorator'; @Component export default class Demo2 extends Vue { value1 = ''; value2 = ''; created() { this.value1 = this.$route.params.id.toString(); this.value2 = this.$route.params.name.toString(); } } </script>
動作確認
http://localhost:8080/Demo
に遷移して「Move」ボタン押下 => Demo2に遷移して、以下が表示されるはず。 ~~~~~ Hello!!! X000001 <= 渡したデータ Mike and Tom <= 渡したデータ ~~~~~
※ props オプション での受け取り
https://router.vuejs.org/ja/guide/essentials/passing-props.html#boolean-%E3%83%A2%E3%83%BC%E3%83%89
より抜粋 ~~~~~~~~~~~~ Boolean モード props を true に設定すると、route.params がコンポーネントのプロパティとして設定されます。 ~~~~~~~~~~~~
利点
コンポーネントとルートの間の密結合を分離する作りになる
router/index.ts
import Vue from 'vue'; import VueRouter, { RouteConfig } from 'vue-router'; Vue.use(VueRouter); const routes: Array<RouteConfig> = [ { path: '/Demo', name: 'Demo', component: () => import('../views/Demo.vue'), }, { path: '/Demo2', name: 'Demo2', component: () => import('../views/Demo2.vue'), // ★ここを追加★ props: true, }, ]; const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, linkActiveClass: 'active', routes, }); export default router;
Demo.vue
* 前回と同じなので省略
Demo2.vue
<template> <div class="home"> Hello!!! <div>{{ this.id }}</div> <div>{{ this.name }}</div> </div> </template> <script lang="ts"> import { Component, Prop, Vue } from 'vue-property-decorator'; @Component export default class Demo2 extends Vue { // ★Propで受け取る★ @Prop() id!: string; @Prop() name!: string; } </script>
関連記事
Vue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/04/30/000000
Vue Router ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/24/000000
Vue Router ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/01/20/165026