コンポーネントにパラメーターを渡す方法
一般にVue Routerを利用する際には、パスに含まれる文字列をパラメーターとしてコンポーネントに渡して利用します。そのような例を図9のサンプルで説明します。
パラメーター渡しの基本
図9で、上側「route渡し」のルート指定はリスト11の通りです。(1)のpath「/fruit1/:name/:price/:count」のうち、コロンが先頭についた文字列(name、price、count)の部分がパラメーターで、FruitView1コンポーネントに渡されます。
{
path: '/fruit1/:name/:price/:count',
component: FruitView1
},
FruitView1コンポーネントの実装はリスト12の通りです。(2)のuseRouteメソッドで、ルートの情報を含む変数routeを取得し、(1)の通り、route.params.<パラメーター名>で値を取得します。
<template>
<!-- route.paramsからパラメーターを取得 ...(1)-->
<div>名前:{{ route.params.name }}</div>
<div>価格:{{ route.params.price }}円</div>
<div>個数:{{ route.params.count }}</div>
</template>
<script setup lang="ts">
import { useRoute } from 'vue-router'
const route = useRoute() // routeはルートの情報を含む ...(2)
</script>
このコンポーネントに値を渡す際は、<RouterLink>にリスト13の通りパスを渡すことで、name:Apple、price:300、count:5がFruitView1コンポーネントに渡されます。
<RouterLink to="/fruit1/Apple/300/5">(略)</RouterLink>
なお、<RouterLink>のリンクではなく、プログラムの処理でコンポーネントに値を渡して表示させることもできます。詳細は公式ページを参照してください。
型定義が利用できる、プロパティ(props)でのデータ渡し
リスト12では、コンポーネント内でuseRouteメソッドを利用して、ルートの情報を直接取得していました。この方法ではコンポーネントの利用にVue Routerが前提となり、Vue Routerを利用しない環境でコンポーネントが再利用できなくなります。また、route.paramsは任意のパラメーターを保持できるため、TypeScriptのメリットを生かせません。
このような問題への対応として、パラメーターをルートではなく、コンポーネントのプロパティ(props)として渡す方法を紹介します。
propsでのパラメーター渡しを利用するには、router/index.tsでリスト14の通り、propsプロパティにtrueを指定してルートを定義します。
{
path: '/fruit2/:name/:price/:count',
component: FruitView2,
props: true // propsによるパラメーター渡しを有効化
}
対応するFruitView2コンポーネントの実装はリスト15となります。(2)のdefinePropsメソッドで、string型のnameとnumber型のprice、countを受け取るよう指定し、(1)のprops.<パラメーター名>でパラメーターを画面に反映します。
<template>
<!-- propsからパラメーターを取得 ...(1)-->
<div>名前:{{ props.name }}</div>
<div>価格:{{ props.price }}円</div>
<div>個数:{{ props.count }}</div>
</template>
<script setup lang="ts">
const props = defineProps<{ // パラメーターの名前、型をpropsに定義 ...(2)
name: string,
price: number,
count: number
}>()
</script>
この場合、TypeScriptによりpropsに型が設定されるため、name、price、count以外をpropsから取得する記述はエラーになります。
まとめ
本記事では、Vue.jsでコンポーネントを切り替え表示するVue Routerの利用法を説明しました。プロジェクトでTypeScriptを有効にして、ルート指定の記述やコンポーネントのパラメーターで型チェックを利用でき、より堅牢な実装ができます。
次回は、Vue 3で推奨されている状態管理ツールPiniaについて説明します。
