ナビゲーションルーター

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>