今回は、React Native ではなく、Cordova + React のアプリ開発についてです。
今まで、ページ遷移に react-router を使用していたのですが、ページの切り替えがアプリっぽくないということで、react-router ではなく Onsenu UI の <Navigation /> を使用して、ページ遷移を行うように変更することにしました。
公式のページはこちら。
Navigator React Component – Onsen UI Framework – Onsen UI
https://ja.onsen.io/v2/api/react/Navigator.html
…が、私は公式サイトのサンプルコードだけではどのようにコードを書けばいいのか分からなかったので、下記のサイトを主に参考にさせていただきました。
Onsen UI React拡張を使ったナビゲーションとタブの使い方 | モナカプレス
https://press.monaca.io/atsushi/267
Onsenu UI のインストールについては割愛させていただきますので、フレームワークのインストールがまだの方は、こちらをご参考にしてください。
まず、ルーティング処理を記述しているページを下記のように変更します。
import React, { Component } from 'react';
import { HashRouter as Router } from 'react-router-dom';
import { Navigator } from 'react-onsenui';
import TopPage from './containers/TopPage';
let props;
class AppNavigator extends Component {
renderPage(route, navigator) {
props = route.props || {};
props.navigator = navigator;
return React.createElement(route.component, props);
}
render() {
return (
<Router>
<Navigator
initialRoute={{component: TopPage}}
renderPage={this.renderPage.bind(this)}
swipeable
onDeviceBackButton={() => props.navigator.popPage()} />
</Router>
);
}
}
export default AppNavigator;
TopPage コンポーネントは、アプリ起動時の初期ページです。
initialRoute に指定することで、アプリ起動時に開くページを指定できます。
ページ遷移の際は、this.props.navigator.pushPage({ component: [遷移先のコンポーネント] }); とすることで、次のページに移動できます。
前のページに戻る際は this.props.navigator.popPage(); です。
他にも、resetPage() や resetPageStack() というメソッドもありますが、こちらはまだ使っていないので、いまいちよく分かっていません…。
また、onDeviceBackButton で Android の端末の戻るボタンが押されたときの挙動を指定しています。
…と言っても、現在開いているページから前のページに戻るだけなんですけどね。
更に swipeable を追加しているので、iOS ではスワイプして戻るという動作が有効になっています。
なお、私の環境でだけなのかもしれませんが… <Navigator /> を react-router-dom の <HashRouter /> で囲わないとページ遷移ができなかったのでそれを追加しています。
理由は分からないのですが…とりあえず動いたから良し!
時間があったら調査したいと思います!
以上、Onsenu UI の <Navigation /> を使って、ネイティブアプリのようなページ遷移を実現する方法についてでした。
ご参考になれば幸いです。