ナビゲーションルーター

Framework7-Vue は、Framework7 自体に強力で柔軟なルーターが搭載されています。ルーターを動作させるには、ルートを指定する必要があります。

Framework7-Vue の唯一の違いは、Vue.js ではすでに Vue コンポーネントでアプリケーションを構成しているため、ページ(Vue コンポーネント)をルートにマッピングする必要があることです。これは、ルートの component プロパティに Vue コンポーネントを渡すことで実現できます。基本的な例を以下に示します。

<!-- app.vue -->
<template>
  <f7-app v-bind="f7params">
    <!-- Current View/Router, initial page will be loaded from home.vue component -->
    <f7-view main url="/"></f7-view>
  </f7-app>
</template>

<script>
  /* Import pages components */
  import HomePage from 'home.vue'
  import AboutPage from 'about.vue'
  import LoginPage from 'login.vue'

  /*
  Now we need to map components to routes.
  We need to pass them along with the F7 app parameters to <f7-app> component
  */

  export default {
    data() {
      return {
        // app params
        f7params: {
          name: 'My App',
          // specify routes for app
          routes: [
            {
              path: '/',
              component: HomePage,
            },
            {
              path: '/about/',
              component: AboutPage,
            },
            {
              path: '/login/',
              component: LoginPage,
            },
            // ...
          ],
          // ...
        }
      };
    },
  }
</script>
<!-- home.vue -->
<template>
  <f7-page name="home">
    <f7-navbar title="Home"></f7-navbar>
    <!-- Page content -->
    ...
    <f7-link href="/about/">About Page</f7-link>
    <f7-link href="/login/">Login Page</f7-link>
  </f7-page>
</template>
<script>
  export default {}
</script>


<!-- about.vue -->
<template>
  <f7-page name="about">
    <f7-navbar title="About"></f7-navbar>
    <!-- Page content -->
  </f7-page>
</template>
<script>
  export default {}
</script>

<!-- login.vue -->
<template>
  <f7-page name="login">
    <f7-navbar title="Login"></f7-navbar>
    <!-- Page content -->
  </f7-page>
</template>
<script>
  export default {}
</script>

すべてのルートオプション、ネストされたルートルーティング可能なタブルーティング可能なモーダルの使用方法については、ルートドキュメント全体を確認してください。

コンポーネントに Props を渡す

ルーターによってロードされた Vue コンポーネントにコンポーネント props を渡すことができます。いくつかの方法があります。

まず、すべてのルートパラメータは自動的に props としてコンポーネントに渡されます。例:

// route with params
{
  path: '/blog/:postId/comments/:commentId/',
  component: BlogPost,
}

そのため、/blog/45/comments/122/ URL でナビゲートすると、次のデータが props に渡されます。

{
  postId: '45',
  commentId: '122',
}

別のオプションは、ルートの options に props を指定することです。

{
  path: '/some-page/',
  component: SomeComponent,
  options: {
    props: {
      foo: 'bar',
      bar: true,
    },
  },
}

最後に、API でナビゲートするときに、props をルートコンポーネントに動的に渡すことができます。

f7router.navigate('/some-page/', {
  props: {
    foo: 'bar',
    bar: true,
  }
})

非同期遅延コンポーネント

Webpack を使用すると、ページコンポーネントをオンデマンドでロードできます。これは、F7 のルート asyncComponent を使用することで可能です。例:

{
  path: '/about/',
  asyncComponent: () => import('./pages/about.vue'),
},

または、より詳細な制御が必要な場合は、async ルートを使用します。

{
  path: '/about/',
  async({ resolve }) {
    // dynamic import component; returns promise
    const vueComponent = () => import('./pages/about.vue');
    // resolve promise
    vueComponent().then((vc) => {
      // resolve with component
      resolve({ component: vc.default })
    });
  } ,
},

ルーター API

ルーターインスタンスにアクセスして ルーター API を使用するには、コンポーネントの特別な f7router コンポーネント prop を使用できます。

<template>
  ...
  <f7-link @click="f7router.navigate('/about/')">About</f7-link>
  <f7-link @click="f7router.back()">Go Back</f7-link>
</template>
<script>
  export default {
    props: {
      f7router: Object,
    }
  }
</script>

f7route および f7router コンポーネント props は、ルートに従ってロードするカスタムページコンポーネント内でのみ使用できることに注意してください。親コンポーネント(View 内、または Vue アプリインスタンスを初期化する場所など)および子コンポーネントではアクセスできません。この場合は、初期化された View インスタンス へのアクセスを使用します。例:f7.views.main.router