ナビゲーションルーター
Framework7-React は、Framework7 自体に強力で柔軟なルーターが備わっています。そして、それを動作させるには、ルートを指定する必要があります。
Framework7-React の唯一の違いは、React.js ではすでに React コンポーネントでアプリケーションを構成しているため、ページ(React コンポーネント)をルートにマッピングする必要があることです。これは、ルートの `component` プロパティに React コンポーネントを渡すことで実行できます。基本的な例を次に示します。
// App.jsx
// Import pages components
import HomePage from 'home.jsx';
import AboutPage from 'about.jsx';
import LoginPage from 'login.jsx';
/*
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,
},
],
};
export default () => (
<App { ...f7params }>
{/* Current View/Router, initial page will be loaded from home.jsx component */}
<View main url="/" />
</App>
)
// home.jsx
export default () => (
<Page name="home">
<Navbar title="Home Page" />
...
<Link href="/about/">About Page</Link>
<Link href="/login/">Login Page</Link>
</Page>
)
// about.jsx
export default () => (
<Page name="about">
<Navbar title="About" />
{/* Page content */}
...
</Page>
)
// login.jsx
export default () => (
<Page name="login">
<Navbar title="Login" />
{/* Page content */}
...
</Page>
)
すべてのルートオプション、ネストされたルート、ルーティング可能なタブ、ルーティング可能なモーダルの使用方法については、ルートドキュメント全体を確認してください。
コンポーネントにプロパティを渡す
ルーターによってロードされた React コンポーネントにコンポーネントプロパティを渡すことができます。これを行うには、いくつかの方法があります。
まず、すべてのルートパラメータは、プロパティとしてコンポーネントに自動的に渡されます。例:
// 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.jsx'),
},
または、より詳細な制御が必要な場合は、`async` ルートを使用します。
{
path: '/about/',
async({ resolve }) {
// dynamic import component; returns promise
const reactComponent = () => import('./pages/about.jsx');
// resolve promise
reactComponent().then((rc) => {
// resolve with component
resolve({ component: rc.default })
});
} ,
},
ルーター API
ルーターインスタンスにアクセスし、ルーター API を使用するには、コンポーネントの特別な **f7router** コンポーネントプロパティを使用できます。
export default ({ f7router }) => {
return (
<Page>
<Link onClick={() => f7route.navigate('/about/')}>About</Link>
<Link onClick={() => f7route.back()}>Back</Link>
</Page>
)
}
`f7route` および `f7router` コンポーネントプロパティは、ルートに従ってロードするカスタムページコンポーネント内でのみ使用できることに注意してください。親コンポーネント(View 内、または React アプリインスタンスを初期化する場所など)および子コンポーネントでは、アクセスできません。そのため、この場合は、初期化された View インスタンス へのアクセスを使用します。例:`f7.views.main.router`