ナビゲーションルーター
Framework7 Svelteは、Framework7自体が強力で柔軟なルーターを備えています。これを機能させるには、ルートを指定する必要があります。
Framework7 Svelteでの唯一の違いは、SvelteではすでにSvelteコンポーネントでアプリケーションを構成しているため、ページ(Svelteコンポーネント)をルートにマッピングする必要があることです。これは、ルートのcomponent
プロパティにSvelteコンポーネントを渡すことで実現できます。以下に基本的な例を示します。
<!-- App.svelte -->
<App { ...f7params }>
<!-- Current View/Router, initial page will be loaded from home.svelte component -->
<View main url="/" />
</App>
<script>
// Import pages components
import HomePage from 'home.svelte';
import AboutPage from 'about.svelte';
import LoginPage from 'login.svelte';
/*
Now we need to map components to routes.
We need to pass them along with the F7 app parameters to <App> component
*/
const f7params = {
name: 'My App',
// specify routes for app
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/about/',
component: AboutPage,
},
{
path: '/login/',
component: LoginPage,
},
],
};
</script>
<!-- home.svelte -->
<Page name="home">
<Navbar title="Home Page" />
...
<Link href="/about/">About Page</Link>
<Link href="/login/">Login Page</Link>
</Page>
<script>
import { Page, Navbar, Link } from 'framework7-svelte';
</script>
<!-- about.svelte -->
<Page name="about">
<Navbar title="About" />
<!-- Page content -->
...
</Page>
<script>
import { Page, Navbar } from 'framework7-svelte';
</script>
<!-- login.svelte -->
<Page name="login">
<Navbar title="Login" />
<!-- Page content -->
...
</Page>
<script>
import { Page, Navbar } from 'framework7-svelte';
</script>
可能なすべてのルートオプション、ネストされたルートの実装方法、ルーティング可能なタブ、ルーティング可能なモーダルについては、完全なルートドキュメントを確認してください。
コンポーネントにプロパティを渡す
ルーターによってロードされたSvelteコンポーネントにコンポーネントのプロパティを渡すことができます。これを行うにはいくつかの方法があります。
まず、すべてのルートパラメーターは自動的にコンポーネントにプロパティとして渡されます。例えば、
// route with params
{
path: '/blog/:postId/comments/:commentId/',
component: BlogPost,
}
/blog/45/comments/122/
URLで移動すると、次のデータがプロパティに渡されます。
{
postId: '45',
commentId: '122',
}
もう1つのオプションは、ルートのoptions
でプロパティを指定することです。
{
path: '/some-page/',
component: SomeComponent,
options: {
props: {
foo: 'bar',
bar: true,
},
},
}
最後に、APIを使用して移動する際に、プロパティをルートコンポーネントに動的に渡すことができます。
f7router.navigate('/some-page/', {
props: {
foo: 'bar',
bar: true,
}
})
非同期遅延コンポーネント
Webpackを使用すると、ページコンポーネントをオンデマンドでロードできます。これはF7のルートasyncComponent
で可能です。例えば、
{
path: '/about/',
asyncComponent: () => import('./pages/about.svelte'),
},
または、より詳細な制御が必要な場合は、async
ルートを使用できます。
{
path: '/about/',
async({ resolve }) {
// dynamic import component, returns promise
import('./pages/about.svelte').then((module) => {
// resolve with component
resolve({ component: module.default })
});
} ,
},
ルーターAPI
ルーターインスタンスにアクセスし、ルーターAPIを使用するには、コンポーネントの特別なf7routerコンポーネントプロパティを使用できます。
<Page>
...
<Link onClick={() => f7router.navigate('/about/')}>About</Link>
<Link onClick={() => f7router.back()}>Go Back</Link>
</Page>
<script>
import { onMount } from 'svelte';
import { Page, Link } from 'framework7-svelte';
// Router component will receive f7router prop with current Router instance
export let f7router;
// Router component will receive f7route prop with current route data
export let f7route;
onMount(() => {
// output current route data
console.log(f7route); // -> { url: '/foo/', query: { id: 3 }, ... }
});
</script>