【Vue Router】URLのパラメーターから個別ページに移動したい
以前の記事をベースに、今回はURLのidパラメータによってページの表示が切り替わる仕組みを作成していきます。
商品一覧ページから商品詳細ページなどへ飛ぶ際に便利かと思います。
router.jsへの追記
import Vue from 'vue' import VueRouter from 'vue-router' // ルート用のコンポーネントの読み込み import Home from '@/views/Home.vue' import Product from '@/views/Product.vue' import ProductList from '@/views/ProductList.vue' //Product.vueを新たにインポート Vue.use(VueRouter) //VueRouterインスタンスの生成 const router = new VueRouter({ mode: 'history', //URLのパスと紐付くコンポーネントをマッピング routes: [ { path: '/', component: Home}, { path: '/product', component: ProductList}, // { path: '/product/:id', component: Product}, :idとしておけばパラメータに可変の値を入れられる { path: '/product/:id(\\d+)', component: Product}, //(\\d+)を付ければパラメータには数字しか入らない正規表現となる ] }) export default router
コメントの通りですが、idに数字しか入らないということであれば下の正規表現を使用した方が適切かと思います。
// { path: '/product/:id', component: Product}, :idとしておけばパラメータに可変の値を入れられる { path: '/product/:id(\\d+)', component: Product}, //(\\d+)を付ければパラメータには数字しか入らない正規表現となる
src/views/ProductList.vueの作成
src/views/Product.vueの転用でOKです。
<template> <div class="product"> <h1>商品一覧</h1> </div> </template>
src/views/Product.vueの編集
<template> <div class="product"> <h1>商品情報</h1> <!--$routeは現在のrouteインスタンスを表す--> <!--:idでパラメーターを指定したものは、params.idで呼び出せる--> <p>このページは、ID.{{ $route.params.id }}の詳細を表示する</p> </div> </template>
説明通りですが、
{{ $route.params.id }}
によってURLのパラメータに入ってきたidを呼び出すことができます。
パラメータをpropsにして渡す
routeを直接表示させるのは、ルートとコンポーネントが密結合していることになるためあまり好ましくないようです。
そこで以下のようにpropsを使用して、idパラメーターを渡すことで、上記と同様の機能を持たせることができます。
src/views/Product.vueの編集
<template> <div class="product"> <h1>商品情報</h1> <!--表示させるのはpropsのid--> <p>このページは、ID.{{ id }}の詳細を表示する</p> </div> </template> <script> // propsでidを受け取るようにすると同時に、Numberでデータ型も指定する export default { props: { id: Number } } </script>
src/router.jsの編集
const router = new VueRouter({ mode: 'history', routes: [ { path: '/', component: Home}, { path: '/product', component: ProductList}, { path: '/product/:id(\\d+)', component: Product, // propsにidとデータ型の指定をする props: route => ({ id: Number(route.params.id) })}, ] })
propsの項目を商品詳細ページに追加します。