Vueルーターでビュー間を移動する方法
著者は、 Write for DOnations プログラムの一環として、 Open Sourcing MentalIllnessを選択して寄付を受け取りました。
序章
ほとんどのWebサイトまたはアプリケーションには、静的または動的に生成される複数のHTMLページがあります。 従来のWebサイトでは、ドキュメントオブジェクトモデル(DOM)が1つと、URLルートごとに1つのページがあります。 ただし、シングルページアプリケーションでは、すべての「ページ」またはビューが1つのHTMLページ内にレンダリングされます。 Vue.jsなどのユーザーインターフェイス(UI)フレームワークは、仮想DOMを使用して、必要に応じてこれらのページとコンポーネントをレンダリングします。 この仮想DOM[X20X]は、元のDOMの JavaScript 表現であり、クライアントが更新するのがはるかに簡単です。
ユーザーが単一ページのアプリケーションにアクセスすると、そのアプリケーションはそれ自体を仮想DOMと比較し、変更されたWebページの部分のみを再レンダリングします。 この手法は、リンクをクリックしたときにページが白く点滅するのを防ぎます。 Webページにヘッダー、コンテンツ、フッターの3つのセクションがあるとします。 別のURLに移動すると、Vueはページ間で変更されたアプリケーションのコンテンツ領域のみをレンダリングします。
Vue.jsでは、ファーストパーティライブラリ VueRouterを使用して複数のビューを作成できます。 このルーターは、URLへのビューとの関連付けを行います。 このチュートリアルでは、Vueルーターライブラリを追加し、それをプロジェクトに統合し、動的に生成されるルートを作成する方法を学習します。 また、開発者として利用できるさまざまなタイプのルートについても学習します。 完了すると、さまざまな方法を使用してナビゲートできるアプリケーションが作成されます。
これらの概念を説明するために、空港情報を表示する小さなアプリケーションを作成します。 ユーザーが空港カードをクリックすると、アプリケーションは空港の詳細の動的ビューに移動します。 これを行うために、プログラムはURLパラメータを読み取り、そのパラメータに基づいてデータを除外します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- コンピューターにインストールされているNode.jsバージョン
10.6.0
以降。 これをmacOSまたはUbuntu18.04にインストールするには、macOSで Node.jsをインストールしてローカル開発環境を作成する方法、またはNode.jsをインストールする方法のPPAを使用してインストールするセクションの手順に従います。 Ubuntu18.04で。 - Vue CLIがマシンにインストールされ、新しいプロジェクトが生成されました。 このチュートリアルでは、アプリの作成時にVueルーターを選択しないでください。 このチュートリアルの最初のステップで、これを手動でインストールします。 このプロジェクトの名前は
airport-codes
になり、ルートディレクトリとして機能します。 - また、JavaScript、HTML、およびCSSの基本的な知識も必要です。これは、 HTMLを使用してWebサイトを構築する方法シリーズ、CSSを使用してWebサイトを構築する方法シリーズにあります。 、およびJavaScriptでコーディングする方法。
ステップ1—サンプルアプリケーションの設定
Vueルーターを学習するために構築しようとしているアプリケーションには、いくつかの初期データが必要です。 このステップでは、チュートリアルの後半でVueアプリにアクセスできるように、このデータを作成して構造化します。
このデータセットを追加するには、data
ディレクトリを作成し、airports.js
という名前のJavaScriptファイルを作成する必要があります。 src
ディレクトリにいない場合は、最初にcd
をそのディレクトリに配置します。
cd src
次に、data
ディレクトリを作成します。
mkdir data
次に、data/airports.js
ファイルを作成し、テキストエディタで開きます。
以下を追加して、アプリケーションのデータを作成します。
空港コード/src/data/airports.js
export default [ { name: 'Cincinnati/Northern Kentucky International Airport', abbreviation: 'CVG', city: 'Hebron', state: 'KY', destinations: { passenger: [ 'Toronto', 'Seattle/Tacoma', 'Austin', 'Charleston', 'Denver', 'Fort Lauderdale', 'Jacksonville', 'Las Vegas', 'Los Angeles', 'Baltimore', 'Chicago', 'Detroit', 'Dallas', 'Tampa' ], cargo: [ 'Anchorage', 'Baltimore', ' Chicago' , 'Indianapolis', 'Phoenix', 'San Francisco', 'Seattle', 'Louisville', 'Memphis' ] } }, { name: 'Seattle-Tacoma International Airport', abbreviation: 'SEA', city: 'Seattle', state: 'WA', destinations: { passenger: [ 'Dublin', 'Mexico City', 'Vancouver', 'Albuquerque', 'Atlanta', 'Frankfurt', 'Amsterdam', 'Salt Lake City', 'Tokyo', 'Honolulu' ], cargo: [ 'Spokane', 'Chicago', 'Dallas', ' Shanghai', 'Cincinnati', 'Luxenbourg', 'Anchorage', 'Juneau', 'Calgary', 'Ontario' ] } }, { name: 'Minneapolis-Saint Paul International Airport', abbreviation: 'MSP', city: 'Bloomington', state: 'MN', destinations: { passenger: [ 'Dublin', 'Paris', 'Punta Cana', 'Winnipeg', 'Tokyo', 'Denver', 'Tulsa', 'Washington DC', 'Orlando', 'Mexico City' ], cargo: [ 'Cincinnati', 'Omaha', 'Winnipeg', 'Chicago', 'St. Louis', 'Portland', 'Philadelphia', 'Milwaukee', 'Ontario' ] } } ]
このデータは、米国内のいくつかの空港で構成されるオブジェクトの配列です。 このアプリケーションでは、このデータを反復処理して、name
、abbreviation
、city
、およびstate
プロパティで構成されるカードを生成します。 ユーザーがカードをクリックすると、Vueルーターを使用して動的ビューにルーティングし、これらのプロパティの1つから読み取ります。 そこから、destination
プロパティに格納されている情報を表示するためのネストされたルートを作成します。
ファイルを保存して終了します。
次に、views
というディレクトリ内にHome.vue
コンポーネントを作成します。 このディレクトリとコンポーネントを作成するには、ターミナルを開き、mkdir
およびtouch
コマンドを使用します。
次のコマンドを実行して、ディレクトリを作成します。
mkdir views
次に、Home.vue
ファイルを作成します。
touch views/Home.vue
このHome.vue
コンポーネントは、このアプリケーションのホームページとして機能します。 その中で、v-for
ディレクティブを利用して、airports.js
データセットを反復処理し、カードに各空港を表示します。
次のコードをHome.vue
に追加します。
空港-codes/src / views / Home.vue
<template> <div class="wrapper"> <div v-for="airport in airports" :key="airport.abbreviation" class="airport"> <p>{{ airport.abbreviation }}</p> <p>{{ airport.name }}</p> <p>{{ airport.city }}, {{ airport.state }}</p> </div> </div> </template> <script> import { ref } from 'vue' import allAirports from '@/data/airports.js' export default { setup() { const airports = ref(allAirports) return { airports } } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } .wrapper { display: grid; grid-template-columns: 1fr 1fr 1fr; grid-column-gap: 1rem; max-width: 960px; margin: 0 auto; } .airport { border: 3px solid; border-radius: .5rem; padding: 1rem; } .airport p:first-child { font-weight: bold; font-size: 2.5rem; margin: 1rem 0; } .airport p:last-child { font-style: italic; font-size: .8rem; } </style>
このコードスニペットにCSSが含まれていることに気付くかもしれません。 Home.vue
コンポーネントでは、空港のコレクションを反復処理しています。各空港には、airport
のCSSクラスが割り当てられています。 このCSSは、各空港にカードの外観を与えるために境界線を作成することにより、生成されたHTMLにスタイルを追加します。 :first-child
と:last-child
は、div
内のHTMLの最初と最後のp
タグに異なるスタイルを適用する疑似セレクターです。 airport
のクラスで。
ファイルを保存して閉じます。
この初期ビューがローカルデータセットとともに作成されたので、次のステップでVueルーターをインストールします。
ステップ2—Vueルーターのインストール
Vueルーターをインストールする方法はいくつかあります。 Vue CLI を使用して新しいプロジェクトを最初から作成する場合は、プロンプトで VueRouterを選択できます。 その後、VueCLIがインストールして構成します。 ただし、このチュートリアルでは、CLIセットアップで VueRouterオプションを選択しなかったと想定しています。 代わりに、npmを介してVueルーターをインストールします。
Vueルーターをインストールするには、最初にsrc
ディレクトリからプロジェクトディレクトリのルートに戻ります。
cd ..
次に、プロジェクトのルートディレクトリにあるターミナルウィンドウで次のコマンドを実行します。
npm i vue-router@next
このコマンドで@next
に気付くかもしれません。 このプロジェクトはVue3とCompositionAPIを使用しているため、このライブラリの最新の実験バージョンをダウンロードするようにnpmに指示しています。 現在のリリースの詳細については、GitHubのVueルーターのリリースページをご覧ください。
これにより、npmからvue-router
ライブラリがダウンロードされ、package.json
ファイルに追加されるため、次にnpm install
を実行したときに自動的にダウンロードされます。
次のステップは、ルートファイルを作成することです。 このファイルには、ユーザーがナビゲートできるすべての可能なルートが含まれます。 URLバーで特定のルートにアクセスすると、URLルートに関連付けられているコンポーネントがマウントされます。
ターミナルのsrc
ディレクトリで、src
ディレクトリに移動し、router
ディレクトリを作成します。
cd src mkdir router
次に、router
ディレクトリ内にindex.js
ファイルを作成します。
touch router/index.js
作成したファイルを任意のエディターで開きます。 最初に行うことは、import
Vueルーターライブラリです。 ルートを作成するために、実際にはこのライブラリのすべてにアクセスする必要はありません。 destructure を選択するか、バンドルサイズを最小化するために必要なものだけをインポートすることができます。 この場合、vue-router
の2つの関数createWebHistory
とcreateRouter
が必要です。 これらの関数は、ユーザーが戻ってVueのルーターオブジェクトを作成できる履歴をそれぞれ作成します。
次のコードをrouter/index.js
に追加します。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router"
次に、次の強調表示された行を追加して、ルーターを作成およびエクスポートします。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router" const router = createRouter({ history: createWebHistory(), }) export default router
このファイルは、createRouter
関数から返されるルーターオブジェクトをエクスポートします。 渡すオブジェクトには、history
とroutes
の2つのプロパティがあります。 history
プロパティには、createWebHistory
から生成された履歴が含まれ、routes
はオブジェクトの配列です。 このチュートリアルの後半でroutes
を追加します。
次に、Home
ビューをインポートしてオブジェクトの配列を作成し、routes
というconst
に格納します。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router" import Home from "@/views/Home.vue" const routes = [ { path: "/", name: "Home", component: Home, }, ] const router = createRouter({ ... }) export default router
各ルートは、次の3つのプロパティを持つオブジェクトです。
path
:URLアドレスname
:プロジェクト内のルートを参照するために割り当てられた名前component
:ブラウザのURLバーにpath
を入力したときにマウントされるコンポーネント
routes
配列が作成されたので、エクスポートされたrouter
オブジェクトに追加する必要があります。
history
キー/値ペアの後に、routes
を追加します。 これは、JavaScriptのroutes: routes
の省略形です。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router" const routes = [ ... ] const router = createRouter({ history: createWebHistory(), routes }) export default router
この時点で、Vueルーターがプロジェクトに統合され、ルートが登録されます。 ファイルを保存して終了します。
別のターミナルで、次のコマンドを実行して、ローカルマシンで開発サーバーを起動します。
npm run serve
ブラウザウィンドウでlocalhost:8080/
にアクセスすると、Home.vue
コンポーネントはまだ表示されません。 この統合プロセスの最後のステップは、このrouter/index.js
ファイルをリッスンし、<router-view />
が参照されているマウントされたコンポーネントを挿入するようにVueに指示することです。 これを行うには、アプリケーションのsrc/main.js
ファイルで参照する必要があります。
まず、src/main.js
を開きます。 次に、次の強調表示された行を追加します。
空港コード/src/main.js
import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App).use(router).mount('#app')
createApp
にチェーンされたこの.use()
関数により、Vue.jsはルート変更をリッスンし、src/router/index.js
ファイルを活用します。 ただし、VueルーターにはマウントされたHome.vue
コンポーネントを表示する方法がありません。 これを行うには、App.vue
ファイル内にrouter-view
コンポーネントを追加する必要があります。 このコンポーネントは、<router-view />
が存在するルートに関連付けられたコンポーネントをマウントするようにVueルーターに指示します。
main.js
ファイルを保存して終了します。
次に、App.vue
ファイルを開きます。 デフォルトのコンテンツを削除して、次のように置き換えます。
空港コード/src/App.vue
<template> <router-view /> </template>
ファイルを保存して終了します。
次に、ブラウザでlocalhost:8080/
にアクセスします。 次のスクリーンショットに示すように、Home.vue
コンポーネントがレンダリングされています。
これで、Vueルーターがダウンロードされ、登録済みのルートと統合されました。 次のセクションでは、2つの内部ページと、ルートが検出されなかった場合のデフォルトの 404 ページを含む、追加のルートを作成します。
ステップ3—内部ページを作成する
この時点で、App.vue
は、src/router/index.js
ファイルで構成されている任意のコンポーネントをレンダリングできます。 Vue CLIで生成されたプロジェクトで作業する場合、作成されるディレクトリの1つはviews
です。 このディレクトリには、router/index.js
ファイルのルートに直接マップされている.vue
コンポーネントが含まれています。 これは自動的には行われないことに注意することが重要です。 先に詳述したように、ルーターファイルに.vue
とimport
を作成して登録する必要があります。
他のすべてのルートを定義する前に、default
ルートを作成できます。 このチュートリアルでは、このデフォルトルートは404-見つかりませんページとして機能します。ルートが見つからない場合のフォールバックです。
まず、404ページとして機能するビューを作成します。 views
ディレクトリに移動します。
cd views
次に、PageNotFound.vue
というファイルを作成します。
touch PageNotFound.vue
テキストエディタで、作成したばかりのこのPageNotFound.vue
ファイルを開きます。 次のHTMLコードを追加して、ビューにレンダリングするものを提供します。
空港-codes/src / views / PageNotFound.vue
<template> <div> <h1>404 - Page Not Found</h1> <p>This page no longer exists or was moved to another location.</p> </div> </template>
ファイルを保存して閉じます。
PageNotFound.vue
コンポーネントが作成されたので、アプリケーションのキャッチオールルートを作成します。 テキストエディタでsrc/router/index.js
ファイルを開き、次の強調表示されたコードを追加します。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router" import Home from "@/views/Home.vue" import PageNotFound from '@/views/PageNotFound.vue' const routes = [ { path: "/", name: "Home", component: Home, }, { path: '/:catchAll(.*)*', name: "PageNotFound", component: PageNotFound, }, ] ...
Vue3用のVueルーターはカスタムRegExを使用します。 path
の値には、この新しいRegExが含まれています。これは、ルートがすでに定義されていない限り、すべてのルートに対してPageNotFound.vue
をレンダリングするようにVueに指示しています。 このルートのcatchAll
は、Vueルーター内の動的セグメントを指し、(.*)
は、任意の文字列をキャプチャする正規表現です。
このファイルを保存し、ブラウザウィンドウのlocalhost:8080/not-found
でアプリケーションにアクセスします。 次の画像に示すように、ブラウザにPageNotFound.vue
コンポーネントがレンダリングされています。
このURLを他のURLに自由に変更してください。 同じ結果が得られます。
先に進む前に、アプリケーション用に別のルートを作成してください。 このルートはaboutページになります。
選択したターミナルを開き、views
ディレクトリにファイルを作成します。
touch About.vue
テキストエディタで、作成したばかりのこのAbout.vue
ファイルを開きます。 次のHTMLを追加して、サイトに関する詳細情報を作成します。
空港-codes/src / views / About.vue
<template> <div> <h1>About</h1> <p>This is an about page used to illustrate mapping a view to a router with Vue Router.</p> </div> </template>
ファイルを保存して閉じます。
そのビューを作成したら、テキストエディタでsrc/router/index.js
ファイルを開き、About.vue
コンポーネントをインポートして、/about
のパスで新しいルートを登録します。
空港コード/src/router/index.js
import { createWebHistory, createRouter } from "vue-router" import Home from '@/views/Home.vue' import About from '@/views/About.vue' import PageNotFound from '@/views/PageNotFound.vue' ... const routes = [ { path: "/", name: "Home", component: Home, }, { path: '/about', name: "About", component: About, }, { path: '/:catchAll(.*)*', name: "PageNotFound", component: PageNotFound, }, ] ...
ファイルを保存して閉じます。
この時点で、3つの異なるルートがあります。
localhost:8080/
、Home.vue
にルーティングしますlocalhost:8080/about
、About.vue
にルーティングします- デフォルトで
PageNotFound.vue
に向かうその他のルート
このファイルを保存したら、ブラウザを開いて、最初にlocalhost:8080/
にアクセスします。 アプリケーションがロードされると、Home.vue
の内容が表示されます。空港カードのコレクションです。
localhost:8080/about
にアクセスして、これらのルートのテストを続けてください。 これは静的ルートであるため、About.vue
コンポーネントのコンテンツが見つかります。この時点で、見出しと段落が含まれています。
次に、ブラウザの他の場所にアクセスして、PageNotFound.vue
コンポーネントをテストできます。 たとえば、localhost:8080/some-other-route
にアクセスすると、そのルートが定義されていないため、VueルーターはデフォルトでそのcatchAll
ルートになります。
このステップが示すように、Vueルーターは特定のルートに関連付けられたコンポーネントをレンダリングする便利なファーストパーティライブラリです。 このステップでは、このライブラリがダウンロードされ、main.js
ファイルを介してグローバルに統合され、src/router/index.js
ファイルで構成されました。
これまでのところ、ほとんどのルートは正確なルートです。 これは、URLフラグメントがルーターのpath
と完全に一致する場合にのみコンポーネントがマウントされることを意味します。 ただし、独自の目的を持ち、コンテンツを動的に生成できる他のタイプのルートがあります。 次のステップでは、さまざまなタイプのルートを実装し、どちらを使用するかを学習します。
ステップ4—パラメータを使用してルートを作成する
この時点で、2つの正確なルートと404ページへの動的ルートを作成しました。 しかし、Vueルーターにはこれらのタイプ以上のルートがあります。 Vueルーターでは次のルートを使用できます。
- 動的ルート:アプリケーションが一意のデータをロードするために参照できる動的パラメーターを持つルート。
- 名前付きルート:
name
プロパティを使用してアクセスできるルート。 この時点で作成されたすべてのルートには、name
プロパティがあります。 - ネストされたルート:子が関連付けられているルート。
- 静的または正確なルート:静的な
path
値を持つルート。
このセクションでは、個々の空港情報を表示する動的ルートと、空港の目的地のネストされたルートを作成します。
動的ルート
動的ルートは、ビューを再利用してルートに応じて異なるデータを表示する場合に役立ちます。 たとえば、URLバーの空港コードに応じて空港情報を表示するビューを作成する場合は、動的ルートを使用できます。 この例では、localhost:8080/airport/cvg
のルートにアクセスすると、アプリケーションは、コードcvg
、シンシナティ/ノーザンケンタッキー国際空港の空港からのデータを表示します。 次に、説明したようにこのビューを作成します。
端末を開き、touch
コマンドを使用して新しい.vue
ファイルを作成します。 src
が現在の作業ディレクトリである場合、コマンドは次のようになります。
touch views/AirportDetail.vue
それが作成されたら、選択したテキストエディタでこのファイルを開きます。 先に進み、template
およびscript
タグを作成して、このコンポーネントをセットアップします。
空港コード/src/views/AirportDetail.vue
<template> <div> </div> </template> <script> export default { setup() { } } </script>
このファイルを保存して閉じます。
次に、このビューをsrc/router/index.js
ファイルに登録する必要があります。 このファイルをテキストエディタで開き、次の強調表示された行を追加します。
空港コード/src/router/index.js
import Home from '@/views/Home.vue' import About from '@/views/About.vue' import AirportDetail from '@/views/AirportDetail.vue' import PageNotFound from '@/views/PageNotFound.vue' ... const routes = [ { path: "/", name: "Home", component: Home, }, { path: '/about', name: "About", component: About, }, { path: '/airport/:code', name: "AirportDetail", component: AirportDetail, }, { path: '/:catchAll(.*)*', name: "PageNotFound", component: PageNotFound, }, ] ...
この新しいルートの:code
は、パラメーターと呼ばれます。 パラメータは、この名前を介してアプリケーションでアクセスできる任意の値です。 この場合、code
という名前のパラメーターがあります。 次に、このパラメーターを利用して、この略語に関連する情報を表示します。
このファイルを保存して閉じます。
データができたので、AirportDetail.vue
コンポーネントをもう一度開きます。 このコンポーネントに空港データをインポートします。
空港コード/src/views/AirportDetail.vue
... <script> import airports from '@/data/airports.js' export default { setup() { } } </script>
次に、そのオブジェクトのabbreviation
プロパティがURLの:code
パラメータと一致する場合に、配列から1つのオブジェクトを返す計算プロパティを作成します。 Vue 3では、vue
ライブラリからcomputed
を分解する必要があります。
空港コード/src/views/AirportDetail.vue
... <script> import { computed } from 'vue' import { useRoute } from 'vue-router' import airports from '@/data/airports.js' export default { setup() { const route = useRoute() const airport = computed(() => { return airports.filter(a => a.abbreviation === route.params.code.toUpperCase())[0] }) return { airport } } } </script>
この計算されたプロパティは、JavaScriptの filter array method を使用して、条件が満たされた場合にオブジェクトの配列を返します。 必要なオブジェクトは1つだけなので、コードは常に最初のオブジェクトを返します。このオブジェクトには、[0]
インデックス構文でアクセスします。 route.params.code
は、ルーターファイルで定義されたパラメーターにアクセスする方法です。 ルートのプロパティにアクセスするには、useRoute
という名前の関数をvue-router
からインポートする必要があります。 これで、ルートにアクセスすると、ルートのすべてのプロパティにすぐにアクセスできます。 ドット表記を使用して、このcode
パラメータにアクセスし、その値を取得しています。
この時点で、URLのコードがabbreviation
プロパティと一致する場合、この計算されたプロパティは単一の空港オブジェクトを返します。 これは、空港のすべてのオブジェクトプロパティにアクセスでき、このコンポーネントのtemplate
を作成できることを意味します。
テキストエディタでAirportDetail.vue
ファイルの編集を続け、空港の情報を表示するためのテンプレートを作成します。
空港コード/src/views/AirportDetail.vue
<template> <div> <p>{{ airport.name }} ({{ airport.abbreviation }})</p> <p>Located in {{ airport.city }}, {{ airport.state }}</p> </div> </template> ...
ブラウザを開き、localhost:8080/airport/sea
にアクセスします。 次の画像に示すように、シアトルタコマ国際空港に関連する情報がブラウザに表示されます。
ネストされたルート
アプリケーションが大きくなるにつれて、親に関連するルートがいくつかあることに気付く場合があります。 これの良い例は、ユーザーに関連付けられた一連のルートである可能性があります。 foo
という名前のユーザーがいる場合、同じユーザーに対して、それぞれが/user/foo/
で始まる複数のネストされたルートを持つことができます。 ユーザーが/user/foo/profile
ルートを使用している場合、ユーザーは自分に関連付けられているプロファイルページを表示します。 ユーザーのposts
ページには、/user/foo/posts
のルートがある場合があります。 このネストにより、コンポーネントとともにルートを整理することができます。 詳細については、Vueルーターのドキュメントをご覧ください。
この同じパターンを、このチュートリアル全体で作成したアプリケーションに適用できます。 このセクションでは、各空港がサポートする目的地を表示するビューを追加します。
ターミナルを開き、src
ディレクトリに、AirportDestinations.vue
という名前の新しいファイルを作成します。
touch views/AirportDestinations.vue
次に、テキストエディタを開き、以下を追加します。
空港コード/src/views/AirportDestinations.vue
<template> <h1>Destinations for {{ airport.name }} ({{ airport.abbreviation }}</h1> <h2>Passenger</h2> <ul> <li v-for="(destination, i) in airport.destinations.passenger" :key="i"> {{ destination }} </li> </ul> <h2>Cargo</h2> <ul> <li v-for="(destination, i) in airport.destinations.cargo" :key="i"> {{ destination }} </li> </ul> </template> <script> import { computed } from 'vue' import { useRoute } from 'vue-router' import airports from '@/data/airports.js' export default { setup() { const route = useRoute() const airport = computed(() => { return airports.filter(a => a.abbreviation === route.params.code.toUpperCase())[0] }) return { airport } } } </script>
このビューは、airports.js
ファイルから各空港のすべての目的地をレンダリングします。 このビューでは、v-for
ディレクティブを使用して宛先を反復処理しています。 AirportDetail.vue
ビューと同様に、airport
という計算プロパティを作成して、URLバーの:code
パラメーターに一致する空港を取得します。
ファイルを保存して閉じます。
ネストされたルートを作成するには、children
プロパティをsrc/router/index.js
ファイルのルートオブジェクトに追加する必要があります。 子(ネストされた)ルートオブジェクトには、その親と同じプロパティが含まれています。
router/index.js
を開き、次の強調表示された行を追加します。
空港コード/src/router/index.js
import Home from '@/views/Home.vue' import About from '@/views/About.vue' import AirportDetail from '@/views/AirportDetail.vue' import AirportDestinations from '@/views/AirportDestinations.vue' import PageNotFound from '@/views/PageNotFound.vue' ... const routes = [ ... { path: '/airport/:code', name: "AirportDetail", component: AirportDetail, children: [ { path: 'destinations', name: 'AirportDestinations', component: AirportDestinations } ] }, ... ] ...
この子ルートのpath
は、親ルートに比べて短いです。 これは、ネストされたルートでは、ルート全体を追加する必要がないためです。 子は親のpath
を継承し、子path
の前に追加します。
ブラウザウィンドウを開き、localhost:8080/airport/msp/destinations
にアクセスします。 親のAirportDetails.vue
と何も変わらないようです。 これは、ネストされたルートを使用する場合、親に<router-view />
コンポーネントを含める必要があるためです。 子ルートにアクセスすると、Vueは子ビューのコンテンツを親に挿入します。
空港コード/src/views/AirportDetail.vue
<template> <div> <p>{{ airport.name }} ({{ airport.abbreviation }})</p> <p>Located in {{ airport.city }}, {{ airport.state }}</p> <router-view /> </div> </template>
この場合、ブラウザで目的地のルートにアクセスすると、AirportDestinations.vue
は、ミネアポリス・セントポール国際空港がサポートする目的地の順不同のリストを、旅客便と貨物便の両方で表示します。
このステップでは、動的なネストされたルートを作成し、URLバーの:code
パラメーターをチェックする計算プロパティの使用方法を学習しました。 すべてのルートが作成されたので、最後のステップで、<router-link />
コンポーネントを使用してリンクを作成することにより、さまざまなタイプのルート間を移動します。
ステップ5—ルート間を移動する
シングルページアプリケーションを使用する場合、注意が必要ないくつかの注意事項があります。 すべてのページが単一のHTMLページにブートストラップされるため、標準のアンカー(<a />
)を使用して内部ルート間を移動することはできません。 代わりに、Vueルーターが提供する<router-link />
コンポーネントを使用する必要があります。
標準のアンカータグとは異なり、router-link
は、名前付きルートの使用など、アプリケーション内の他のルートにリンクするためのさまざまな方法を提供します。 名前付きルートは、name
プロパティが関連付けられているルートです。 これまでに作成したすべてのリンクには、name
がすでに関連付けられています。 このステップの後半では、path
ではなくname
を使用してナビゲートする方法を学習します。
<router-link />
コンポーネントの使用
<router-link />
コンポーネントは、最初にVueRouterをアプリケーションに統合したときにグローバルにインポートされました。 このコンポーネントを使用するには、このコンポーネントをテンプレートに追加し、小道具の値を指定します。
エディタのviews
ディレクトリ内のHome.vue
コンポーネントを開きます。 このビューには、airports.js
ファイルにあるすべての空港が表示されます。 router-link
を使用して、含まれているdiv
タグを置き換え、各カードをクリックしてそれぞれの詳細ビューに表示できます。
次の強調表示された行をHome.vue
に追加します。
空港-codes/src / views / Home.vue
<template> <div class="wrapper"> <router-link v-for="airport in airports" :key="airport.abbreviation" class="airport"> <p>{{ airport.abbreviation }}</p> <p>{{ airport.name }}</p> <p>{{ airport.city }}, {{ airport.state }}</p> </router-link> </div> </template> ...
最低限、router-link
にはto
と呼ばれる1つの支柱が必要です。 このto
小道具は、いくつかのキーと値のペアを持つオブジェクトを受け入れます。 このカードはv-for
ディレクティブを使用しているため、これらのカードはデータ駆動型です。 AirportDetail.vue
コンポーネントに移動できる必要があります。 そのコンポーネントのパスを確認すると、/airports/:code
からアクセスできます。
path
プロパティを介してナビゲートする場合、これは1対1の一致です。 次の強調表示されたセグメントを追加します。
空港-codes/src / views / Home.vue
<template> <div class="wrapper"> <router-link :to="{ path: `/airports/${airport.abbreviation}` }" v-for="airport in airports" :key="airport.abbreviation" class="airport"> ... </router-link> </div> </template> ...
このコードでは、 JavaScript文字列補間を使用して、path
プロパティの値として空港コードを動的に挿入しています。 ただし、アプリケーションの規模が大きくなるにつれて、path
を介して別のルートに移動するのが最善の方法ではない場合があります。 実際、名前付きルートを使用してナビゲートすることが一般的にベストプラクティスと見なされています。
名前付きルートを実装するには、path
上のルートのname
を使用します。 src/router/index.js
を参照すると、AirportDetail.vue
の名前はAirportDetail
であることがわかります。
空港-codes/src / views / Home.vue
<template> <div class="wrapper"> <router-link :to="{ name: 'AirportDetail' }" v-for="airport in airports" :key="airport.abbreviation" class="airport"> ... </router-link> </div> </template> ...
正確なルートよりも名前付きルートを使用する利点は、名前付きルートがルートのpath
に依存しないことです。 URL構造は開発中に常に変更されますが、ルートの名前はめったに変更されません。
正確なルートで以前に行ったように、空港コードを渡すことができないことに気付くかもしれません。 名前付きルートにパラメーターを渡す必要がある場合は、パラメーターを表すオブジェクトを含むparams
プロパティを追加する必要があります。
空港-codes/src / views / Home.vue
<template> <div class="wrapper"> <router-link :to="{ name: 'AirportDetail', params: { code: airport.abbreviation } }" v-for="airport in airports" :key="airport.abbreviation" class="airport"> ... </router-link> </div> </template> ...
このファイルを保存して、ブラウザのlocalhost:8080
で表示します。 Seattle-Tacoma空港カードをクリックすると、localhost:8080/airport/sea
に移動します。
プログラマティックナビゲーション
<router-link />
コンポーネントは、HTMLテンプレート内の別のビューに移動する必要がある場合に使用すると便利です。 しかし、JavaScript関数内でルート間を移動する必要がある場合はどうでしょうか。 Vueルーターは、プログラムナビゲーションと呼ばれるこの問題の解決策を提供します。
このチュートリアルの前半で、PageNotFound
と呼ばれるキャッチオールルートを作成しました。 airport
計算プロパティがAirportDetail.vue
およびAirportDestinations.vue
コンポーネントでundefined
を返した場合は、常にそのページに移動することをお勧めします。 このセクションでは、この機能を実装します。
テキストエディタで、AirportDetail.vue
コンポーネントを開きます。 これを実現するには、airport.value
が未定義かどうかを検出します。 この関数は、コンポーネントが最初にマウントされたときに呼び出されます。つまり、Vueのライフサイクルメソッドを使用する必要があります。
次の強調表示された行を追加します。
空港コード/src/views/AirportDetail.vue
<template> <div v-if="airport"> <p>{{ airport.name }} ({{ airport.abbreviation }})</p> <p>Located in {{ airport.city }}, {{ airport.state }}</p> <router-view /> </div> </template> <script> import { computed, onMounted } from 'vue' import { useRoute } from 'vue-router' import airports from '@/data/airports.js' import router from '@/router' export default { setup() { const route = useRoute() const airport = computed(() => { return airports.filter(a => a.abbreviation === route.params.code.toUpperCase())[0] }) onMounted(() => { if (!airport.value) { // Navigate to 404 page here } }) return { airport } } } </script>
このonMounted
関数では、airport.value
が偽の値であるかどうかをチェックしています。 そうである場合は、PageNotFound
にルーティングします。 router-link
コンポーネントを処理した場合と同様に、プログラムによるルーティングを処理できます。 JavaScript関数ではコンポーネントを使用できないため、router.push({ ... })
を使用する必要があります。 router
オブジェクトのこのpush
メソッドは、リンクコンポーネントを使用するときに、to
プロパティの値を受け入れます。
/src/views/AirportDetail.vue
<script> ... onMounted(() => { if (!airport.value) { router.push({ name: 'PageNotFound' }) } }) ... </script>
ルートが存在しない場合、またはデータが適切に返されない場合、これによりユーザーは壊れたWebページから保護されます。
ファイルを保存し、localhost:8080/airport/ms
に移動します。 ms
はデータ内の空港コードではないため、airport
オブジェクトは未定義になり、ルーターは404ページにリダイレクトします。
結論
このチュートリアルでは、Vueルーターを使用して、異なるビュー間をルーティングするWebアプリケーションを作成しました。 正確なルート、名前付きルート、ネストされたルートなど、さまざまなタイプのルートを学習し、router-link
コンポーネントを使用してパラメーターを使用してリンクを作成しました。 最後のステップでは、ルーターのpush()
機能を利用して、JavaScriptを使用したプログラムナビゲーションを提供しました。
Vueルーターの詳細については、ドキュメントを読むことをお勧めします。 CLIツールには、このチュートリアルではカバーされていない多くの追加機能があります。 Vueのその他のチュートリアルについては、Vueトピックページをご覧ください。