Vue3 ルーティング(Vue Router)

この章では、Vue ルーティングについて紹介します。

Vue ルーティングでは、異なる URL を介して異なるコンテンツにアクセスできます。

Vue を使用すると、複数のビューを持つシングルページ Web アプリケーション(single page web application、SPA)を実現できます。

Vue.js ルーティングには、vue-router ライブラリの読み込みが必要です。

中国語ドキュメントのURL:vue-router ドキュメント。

Vue Router は、URL パスをアプリケーション内のコンポーネントにマッピングします。ユーザーがアプリケーション内を移動すると、URL は更新されますが、ページは再読み込みされないため、スムーズなユーザーエクスペリエンスが提供されます。

上の図は、2 レベルのネストされたルート構造を示しています。:

  • 最上位レベル(App.vueの<router-view>)は、独立レイアウト(例:Login.vue)またはメインレイアウトをレンダリングします。(Layout.vue)。
  • メインレイアウト(Layout.vue)内部には 2 つ目の<router-view>が含まれ、機能ページの子コンポーネント(例:Dashboard.vue、User.vue)のレンダリングに使用され、これによりページヘッダー、サイドバー、ページフッターの永続表示を実現します。
  • 一致しないパスは最終的に独立したpage404.vue。

コア構成要素

構成要素 説明 オプション API でのアクセス コンポジション API でのアクセス
routerインスタンス ルーティングシステム全体のインスタンスで、グローバルナビゲーションやルートの追加などに使用します。 this.$router useRouter()
routeオブジェクト 現在アクティブなルートの状態オブジェクトで、現在の URL、パラメータ、クエリなどの情報を含みます。 this.$route useRoute()
<router-link> アプリケーション内でナビゲーションを行うためのコンポーネントで、1 つの<a>タグとしてレンダリングされますが、デフォルトのページリロードを防ぐことができます。 - -
<router-view> ルートにマッチしたコンポーネントはこの位置にレンダリングされます。 - -

インストール

npm インストール

npm install vue-router

npm(中国国内ミラー)

淘宝ミラーの使用を推奨します:

npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install vue-router@4

直接ダウンロード / CDN

https://unpkg.com/vue-router@4

基本的な使い方

1. ルートテーブルの作成

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

export default createRouter({
  history: createWebHistory(),
  routes
})

2. アプリケーションへのマウント

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

3. ページの描画先

<router-view></router-view>

4. 遷移

<router-link to="/about">About</router-link>

5. 動的ルート

{ path: '/user/:id', component: User }

`/user/10` にアクセスすると、`$route.params.id === '10'` になります。

6. 遅延読み込み

const About = () => import('../views/About.vue')

7. ナビゲーションガード(認証)

router.beforeEach((to, from, next) => {
  next()
})

8. リダイレクト

{ path: '/old', redirect: '/' }

9、404

{ path: '/:pathMatch(.*)*', component: NotFound }

簡単な例

Vue.js + vue-router を使用すると、シングルページアプリケーションを簡単に実装できます。

<router-link>コンポーネントであり、ナビゲーションリンクを設定して異なる HTML コンテンツを切り替えるために使用されます。to属性はターゲットアドレスを指し、 は表示するコンテンツです。

次の例では、vue-router を追加し、コンポーネントとルートのマッピングを設定して、vue-router にそれらをどこでレンダリングするかを指示します。コードは次のとおりです。

HTML コード

<div id="app"> <h1>Hello App!</h1> <p> <!--router-link コンポーネントを使用してナビゲーションします--> <!--`to` を渡すことでリンクを指定します--> <!--`<router-link>` は、正しい `href` 属性を持つ `<a>` タグを生成します。--> <router-link to="/">Go to Home</router-link> <router-link to="/about">Go to About</router-link> </p> <!--ルートアウトレット--> <!--ルートにマッチしたコンポーネントがここにレンダリングされます--> <router-view></router-view> </div>

router-link

通常の a タグではなく、カスタムコンポーネント router-link を使用してリンクを作成していることに注意してください。これにより、Vue Router はページを再読み込みせずに URL を変更し、URL の生成とエンコーディングを処理できます。これらの機能をどのように活用できるかについては、後ほど説明します。

router-view

router-view は URL に対応するコンポーネントを表示します。レイアウトに合わせて、どこにでも配置できます。

JavaScript コード

//1. ルートコンポーネントを定義します。 //他のファイルからインポートすることもできます。 const Home = { template: '<div>Home</div>' } const About = { template: '<div>About</div>' } //2. いくつかのルートを定義します。 //各ルートはコンポーネントにマッピングする必要があります。 //ネストされたルートについては後で説明します。 const routes = [ { path: '/', component: Home }, { path: '/about', component: About }, ] //3. ルートインスタンスを作成し、`routes` 設定を渡します。 //ここでさらに多くの設定を入力できますが、ここでは //一時的にシンプルに保ちます。 const router = VueRouter.createRouter({ //4. 内部には history モードの実装が用意されています。簡単にするため、ここでは hash モードを使用します。 history: VueRouter.createWebHashHistory(), routes, //`routes: routes` の省略形 }) //5. ルート(root)インスタンスを作成してマウントします。 const app = Vue.createApp({}) //必ず _use_ ルートインスタンスを使用して、 //アプリケーション全体でルーティングを有効にします。 app.use(router) app.mount('#app') //これで、アプリケーションが起動しました!

試してみる »

クリックしたナビゲーションリンクにはスタイルが適用されます。class ="router-link-exact-active router-link-active"。

アプリケーションの例

以下の例は、ルーティングの定義、作成、マウント、ナビゲーションとレンダリングという 5 つの核心的なステップを網羅しています。

1. main.js(エントリーファイル)

例

import { createApp } from 'vue';
import App from './App.vue';
import router from './router'; // 設定済みのルートインスタンスをインポート

// 1. Vue アプリケーションインスタンスを作成
const app = createApp(App);

// 2. ルートをマウント
app.use(router);

// 3. DOM にマウント
app.mount('#app');

2. router/index.js(ルート設定)

例

import { createRouter, createWebHistory } from 'vue-router';

// ルートコンポーネントをインポート(ここでは同期インポートを使用して例を簡略化)
const Home = { template: '<h2>Home Page</h2><p>Welcome to the application home!</p>' };
const About = { template: '<h2>About Us</h2><p>Learn more about this project.</p>' };

// ルート定義の配列を定義
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  },
  // 404 マッチング(最後に配置)
  {
    path: '/:pathMatch(.*)*',
    name: 'NotFound',
    component: { template: '<div>404 Not Found</div>' }
  }
];

// Router インスタンスを作成
const router = createRouter({
  // HTML5 History モードを使用(推奨)
  history: createWebHistory(),
  routes, // ルート設定
});

export default router;

3. App.vue(ルートコンポーネント)

例

<template>
  <div>
    <h1>Vue Router の例</h1>
   
    <nav>
      <router-link to="/" active-class="active-link">Home</router-link> |
      <router-link to="/about" active-class="active-link">About</router-link> |
      <router-link to="/nonexistent">404 Demo</router-link>
    </nav>
   
    <hr>
   
    <main>
      <router-view></router-view>
    </main>
  </div>
</template>

<style>
/* シンプルなアクティブスタイル */
.active-link {
  font-weight: bold;
color: #427EB9; /* Vue グリーン */
}
/* リンクの間隔を調整 */
nav a {
  margin: 0 5px;
  text-decoration: none;
}
</style>

このアプリケーションを実行すると:

  • クリックHomeリンクで、URL は/,<router-view>の中に表示されHome Pageコンポーネントの内容。
  • クリックAboutリンクで、URL は/about,<router-view>の中に表示されAbout Usコンポーネントの内容。
  • クリック404 Demoリンクで、URL は/nonexistent,<router-view>の中に表示され404 Not Foundコンポーネントの内容。

<router-link> 関連属性

次に、<router-link> の属性について詳しく見ていきましょう。

to

ターゲットルートのリンクを表します。クリックされると、内部で直ちに `to` の値が `router.push()` に渡されます。そのため、この値は文字列、またはターゲット位置を記述するオブジェクトのいずれかになります。

<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染结果 -->
<a href="home.html">Home</a>

<!-- 使用 v-bind 的 JS 表达式 -->
<router-link v-bind:to="'home'">Home</router-link>

<!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->
<router-link :to="'home'">Home</router-link>

<!-- 同上 -->
<router-link :to="{ path: 'home' }">Home</router-link>

<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

<!-- 带查询参数,下面的结果为 /register?plan=private -->
<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>

replace

replace 属性を設定すると、クリック時に router.replace() が呼び出され、router.push() ではなくなり、ナビゲーション後に履歴が残りません。

<router-link :to="{ path: '/abc'}" replace></router-link>

append

append 属性を設定すると、現在の (相対) パスの前にそのパスが追加されます。例えば、/a から相対パス b にナビゲートする場合、append を設定していなければパスは /b になり、設定していれば /a/b になります。

<router-link :to="{ path: 'relative/path'}" append></router-link>

tag

時には、次のように<router-link>特定のタグとしてレンダリングしたい場合があります。例えば<li>。tagそこで、私たちは次を使用します

<router-link to="/foo" tag="li">foo</router-link>
<!-- 渲染结果 -->
<li>foo</li>

active-class

prop クラスでどのタグを指定します。同様に、クリックを監視してナビゲーションをトリガーします。

<style>
   ._active{
      background-color : red;
   }
</style>
<p>
   <router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1</router-link>
   <router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>

ここに注意してくださいclass使用active-class="_active"。

exact-active-class

リンクが完全に一致したときにアクティブになる class を設定します。次のコードで置き換えることができます。

<p>
   <router-link v-bind:to = "{ path: '/route1'}" exact-active-class = "_active">Router Link 1</router-link>
   <router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>

event

ナビゲーションをトリガーするために使用できるイベントを宣言します。文字列または文字列を含む配列にすることができます。

<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>

上記のコードでは event を mouseover に設定しており、マウスが Router Link 1 の上に移動すると、ナビゲーションの HTML コンテンツが変更されます。


Vue Router(v4、Vue 3)コア API マニュアル

一、createRouter設定項目

設定項目 用途 例
history URL パターンを指定 createWebHistory()
routes ルートテーブル定義配列 [{ path: '/', component: Home }]
scrollBehavior ページのスクロール位置を制御 { top: 0 }
strict 末尾のスラッシュを厳密に区別するかどうか true
linkActiveClass リンクアクティブ時の Class 'active'
linkExactActiveClass リンク完全一致アクティブ時の Class 'exact-active'
parseQuery カスタム URL クエリ解析 (q) => ({...})
stringifyQuery カスタム URL クエリシリアライズ (obj) => 'a=1'

二、History ファクトリ

API 用途 例
createWebHistory() HTML5 History モードを使用(推奨) createWebHistory()
createWebHashHistory() Hash モードを使用(URL に#) createWebHashHistory()
createMemoryHistory() SSR(サーバーサイドレンダリング)に適用 createMemoryHistory()

三、RouteRecord(ルートテーブル項目)

フィールド 用途 例
path ルートパス定義 /user/:id
name ルート命名 name: 'User'
component 対応するメインコンポーネント UserView
components 名前付きビューに使用(複数<router-view>) { default: A, left: B }
redirect リダイレクト先 redirect: '/login'
children ネストされた子ルートを定義 [ { path: 'profile' } ]
props 将 params自動的にコンポーネントに変換props props: true
meta カスタムメタ情報フィールド { auth: true }
alias 現在のルートにエイリアスを追加(複数エントリ) alias: '/b'
beforeEnter ルート限定ナビゲーションガード { beforeEnter: (to,from,next)=>{} }

四、ルートナビゲーション(Router インスタンスメソッド)

Router API 用途 例
router.push(to) プログラムによる遷移、history スタックに新しいレコードを追加 router.push('/a')
router.replace(to) プログラムによる遷移、現在の history レコードを置き換え router.replace('/a')
router.back() 1 つ戻る router.back()
router.forward() 1 つ進む router.forward()
router.go(n) history スタックを手動でオフセット router.go(-1)
router.addRoute(route) ルートレコードを動的に追加 router.addRoute({ name:'Post', ... })
router.removeRoute(name) 名前でルートレコードを削除 router.removeRoute('user')
router.getRoutes() すべてのルートレコードを取得 router.getRoutes()
router.hasRoute(name) 指定された名前のルートが存在するかどうかを判断 router.hasRoute('user')

五、ナビゲーションガード

ガード スコープ フックシグネチャ
router.beforeEach グローバル前置 (to, from, next) => {}
router.beforeResolve グローバル解決フェーズ(コンポーネント内ガードと非同期コンポーネントの解決後) (to, from, next) => {}
router.afterEach グローバル後置(ナビゲーションを阻止できない) (to, from, failure) => {}
beforeEnter ルート限定 beforeEnter: (to, from, next) => {}
beforeRouteEnter コンポーネント内 (アクセス不可this) beforeRouteEnter(to, from, next) {}
beforeRouteUpdate コンポーネント内(現在のルートが再利用されるとき、例: パラメータ変更) beforeRouteUpdate(to, from, next) {}
beforeRouteLeave コンポーネント内(そのコンポーネントを離れるとき) beforeRouteLeave(to, from, next) {}

六、<router-link>属性

属性 用途 例
to ターゲットルートアドレス to="/a" 或 :to="{ name: 'user', params: { id: 1 } }"
replace ナビゲーション時に使用router.replace() <router-link replace>
custom カスタムレンダリング、スロットと組み合わせて使用 <router-link custom v-slot="{ href }">
active-class リンクアクティブ時に適用される Class 'active'
exact-active-class リンク完全一致時に適用される Class 'exact'

七、<router-view>属性

属性 用途 例
name マルチビュー(名前付きビュー)レンダリングに使用 <router-view name="left">
route (上級)レンダリングするルートオブジェクトを強制的に指定 <router-view :route="someRoute">

八、Route(現在のルートオブジェクト)

このオブジェクトはuseRoute() 或 this.$route取得されます。

フィールド タイプ 意味 例
params object 動的パスパラメータ route.params.id
query object URL クエリパラメータ route.query.q
hash string URL 内のハッシュ値(含む#) route.hash
fullPath string 完全な解決後パス(クエリとハッシュを含む) /user/1?x=1
name string 現在のルートの名前 'User'
path string 現在のパス(クエリとハッシュを含まない) /user/1
meta object ルート設定内のmeta情報 route.meta.auth
matched RouteRecord[] ルートが一致したすべてのレコード(ネストされたルート用) route.matched

九、コンポジション API(Composition API)

API 用途 例
useRoute() 現在のルートオブジェクトを取得(Route) const route = useRoute()
useRouter() ルートインスタンスを取得(Router) const router = useRouter()

十、プログラムによるナビゲーション(完全な例)

用途 例 備考
名前付きルートへの遷移 router.push({ name:'User', params:{ id:10 } }) 推奨方法、パス順序に依存しない
Query パラメータ付き遷移 router.push({ path:'/search', query:{ q:'x' } }) パス + クエリパラメータ
待機可能な Push/Replace await router.push('/a') ナビゲーションは非同期で、完了を待つことができます
URL オブジェクトへの遷移 router.push({ path: '/foo', hash: '#bar' }) URL の詳細を完全に制御
その他の拡張