Vue 2 ルーティングにおける props 設定によるパラメータ受け渡しの最適化

Vue Router を使用してコンポーネントにパラメータを渡す際、従来は $route.params$route.query を直接参照する必要があり、コードが冗長になりがちです。これを解決するために、ルート設定で props オプションを活用することで、よりクリーンで保守性の高いコードを実現できます。

1. オブジェクト形式(静的値の注入)

props にオブジェクトを指定すると、そのキーと値がそのままコンポーネントのプロパティとして渡されます。動的なルートパラメータには対応しないため、使用頻度は低いです。

// ルート定義
{
  path: 'detail',
  component: Detail,
  props: { mode: 'static', version: 2 }
}
<!-- Detail コンポーネント -->
export default {
  props: ['mode', 'version']
}

2. 真偽値形式(params の自動マッピング)

props: true を設定すると、ルートパスに含まれる params(例: /detail/:id/:title)が自動的にコンポーネントの props として渡されます。

// ルート定義(パスに params 含む前提)
{
  path: 'detail/:id/:title',
  component: Detail,
  props: true
}
<!-- Detail コンポーネント -->
export default {
  props: ['id', 'title']
}

3. 関数形式(柔軟なパラメータ変換)

最も柔軟性が高い方法。関数を指定することで、$route オブジェクトに基づき任意の props を生成できます。特に query パラメータや複合的なロジックが必要な場合に有効です。

// ルート定義
{
  path: 'detail',
  component: Detail,
  props(route) {
    return {
      itemId: route.query.id,
      itemTitle: route.query.title,
      source: 'router'
    };
  }
}
<!-- Detail コンポーネント -->
export default {
  props: ['itemId', 'itemTitle', 'source']
}

ルーター設定例(index.js)

import VueRouter from 'vue-router';
import About from '../pages/About.vue';
import Home from '../pages/Home.vue';
import News from '../pages/News.vue';
import Message from '../pages/Message.vue';
import Detail from '../pages/Detail.vue';

export default new VueRouter({
  routes: [
    { path: '/about', component: About },
    {
      path: '/home',
      component: Home,
      children: [
        { path: 'news', component: News },
        {
          path: 'message',
          component: Message,
          children: [
            {
              name: 'detail',
              path: 'detail/:id?/:title?', // params に対応
              component: Detail,
              // 以下のいずれかの props 設定を選択可能

              // ① 静的オブジェクト
              // props: { debug: true }

              // ② params 自動マッピング(パスに :id, :title 必須)
              // props: true

              // ③ 動的関数(query 対応含む)
              props(route) {
                return {
                  id: route.params.id || route.query.id,
                  title: route.params.title || route.query.title,
                  timestamp: Date.now()
                };
              }
            }
          ]
        }
      ]
    }
  ]
});

タグ: Vue2 VueRouter props

5月19日 01:54 投稿