ナビゲーションルーター
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