今回は Onsen UI でアプリにサイドバーメニューを実装する方法についてです。
利用したのは <Splitter>
、<SplitterContent>
、<SplitterSide>
のコンポーネントです。
公式のサンプルコードがちょっとわかりにくいと感じ、実装する際にハマったので自分のための備忘録も兼ねてまとめ。
公式のドキュメントはこちらから。
Splitter React Component – Onsen UI Framework – Onsen UI
https://ja.onsen.io/v2/api/react/Splitter.html
実装方法は下記のとおりです。
import React, { Component } from 'react'; import { List, ListItem, Page, Toolbar, ToolbarButton, Splitter, SplitterSide, SplitterContent } from 'react-onsenui'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faBars } from '@fortawesome/free-solid-svg-icons'; import 'onsenui/css/onsenui.css'; import 'onsenui/css/onsen-css-components.css'; class MenuPage extends Component { constructor(props) { super(props); this.state = { isShowMenu: false, }; this.toggleMenuShow = this.toggleMenuShow.bind(this); } toggleMenuShow() { this.setState({ isShowMenu: !this.state.isShowMenu }); } render() { return ( <div> <Splitter> <SplitterContent> <Page renderToolbar={() => <Toolbar> <div className="left"> <ToolbarButton onClick={this.toggleMenuShow}> <FontAwesomeIcon icon={faBars} /> </ToolbarButton> </div> <div className="center"> Title </div> </Toolbar>}> <p>ページA</p> </Page> </SplitterContent> <SplitterSide side="left" width={200} collapse="collapse" isOpen={this.state.isShowMenu} swipeable={true}> <Page> <List> <ListItem>ページA</ListItem> <ListItem>ページB</ListItem> <ListItem>ページC</ListItem> </List> </Page> </SplitterSide> </Splitter> </div> ); } } export default MenuPage;
まず、<Splitter>
タグでページ全体を囲みます。
で、<SplitterContent>
タグ内で、表示したいページレイアウトを記載します。
上記のコードでは、左端にハンバーガーメニューのアイコンボタンがあるヘッダーと、「ページA」という文字を表示させています。
そして、<SplitterSide>
タグ内に、サイドバーメニューのレイアウトを記載します。
今回は「ページA」「ページB」「ページC」というテキストをリスト表示しています。
レイアウト的には上記のみでOKですが、ヘッダーのハンバーガーメニューアイコンをタップしてサイドバーメニューを開きたいので、toggleMenuShow()
という関数と、isShowMenu
という state を宣言しています。
toggleMenuShow()
が実行されるたびに、isShowMenu
の true/false が切り替わるというシンプルなプログラムです。
で、isShowMenu
を <SplitterSide>
の isOpen に指定しているので、ハンバーガーメニューアイコンをクリックするたびに、サイドバーメニューの表示/非表示が切り替わるようになっています。
と、ここまでは分かったのですが、ハマったのが <SplitterSide>
の collapse
というオプションです。
上記コードだと、41行目に記述しています。
Optional と書いてあったので、最初は collapse
の指定を省略していたのですが、どうやらこれが指定されていないと、常にサイドバーメニューが表示されっぱなしで、かつ非表示にもできない状態に陥りました。
サンプルコードを見比べて、もしかして…とこの collapse
を追加したところ、isOpen
の値に応じて表示/非表示が切り替わるようになりました!
以上、Onsen UI のサイドバーメニューの実装方法と、正常に動作しない場合の対処法でした。
いや…気づかないって、こんなの…。
ということで、同じように苦しむ方が出ないように、簡単にではありますがまとめてみました。
参考になれば幸いです。