Vue.js Vue Router

Vue RouterによるSPA

Vue Routerを使ってシングルページアプリケーションを構築しよう。ブログサイトでページ遷移を実装します。

タスク

Vue Routerの設定

ルーターの作成とルート定義を実装しよう

ナビゲーションの実装

router-linkとrouter-viewを使ってページ遷移を実装しよう

動的ルートの実装

パラメータ付きルートで記事詳細ページを作ろう

ヒント

Vue Routerのルート定義、router-link、router-viewを使って、ページ遷移を実装しましょう。

参考コード

// 記事データ
const articles = [
  { id: 1, title: 'Vue 3の新機能', category: 'vue', content: 'Vue 3では多くの新機能が追加されました...' },
  { id: 2, title: 'Vue Routerの使い方', category: 'vue', content: 'Vue Routerを使うとSPAが簡単に作れます...' },
  { id: 3, title: 'JavaScriptの基本', category: 'javascript', content: 'JavaScriptの基本を学びましょう...' },
  { id: 4, title: 'ES6の新機能', category: 'javascript', content: 'ES6では多くの便利な機能が追加されました...' }
]

// ホームページコンポーネント
const Home = {
  data() {
    return { articles }
  },
  template: `
    <div>
      <h3>最新記事</h3>
      <div class="article-list">
        <div v-for="article in articles" :key="article.id" class="article-card">
          <router-link :to="'/article/' + article.id">
            <div class="article-title">{{ article.title }}</div>
          </router-link>
          <div class="article-meta">
            <span class="category-tag">{{ article.category }}</span>
          </div>
        </div>
      </div>
    </div>
  `
}

// 記事詳細ページコンポーネント
const ArticleDetail = {
  data() {
    return { articles }
  },
  computed: {
    article() {
      const id = parseInt(this.$route.params.id)
      return this.articles.find(a => a.id === id)
    }
  },
  template: `
    <div v-if="article">
      <h3>{{ article.title }}</h3>
      <div class="article-meta">
        <span class="category-tag">{{ article.category }}</span>
      </div>
      <p>{{ article.content }}</p>
      <router-link to="/">← ホームに戻る</router-link>
    </div>
    <div v-else>
      <h3>記事が見つかりません</h3>
      <router-link to="/">ホームに戻る</router-link>
    </div>
  `
}

// カテゴリーページコンポーネント
const CategoryPage = {
  data() {
    return { articles }
  },
  computed: {
    categoryArticles() {
      const category = this.$route.params.category
      return this.articles.filter(a => a.category === category)
    }
  },
  template: `
    <div>
      <h3>{{ $route.params.category }}の記事</h3>
      <div class="article-list">
        <div v-for="article in categoryArticles" :key="article.id" class="article-card">
          <router-link :to="'/article/' + article.id">
            <div class="article-title">{{ article.title }}</div>
          </router-link>
          <div class="article-meta">
            <span class="category-tag">{{ article.category }}</span>
          </div>
        </div>
      </div>
    </div>
  `
}

// ルート定義
const routes = [
  { path: '/', component: Home },
  { path: '/article/:id', component: ArticleDetail },
  { path: '/category/:category', component: CategoryPage }
]

// Vue Routerの作成
const router = VueRouter.createRouter({
  history: VueRouter.createWebHashHistory(),
  routes
})

// アプリケーションの作成
const app = Vue.createApp({})

// ルーターをアプリケーションに追加
app.use(router)

// マウント
app.mount('#app')

プレビュー

見本