【React】Onsen UIでサイドバーメニューを実装する方法

今回は 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 のサイドバーメニューの実装方法と、正常に動作しない場合の対処法でした。
いや…気づかないって、こんなの…。
ということで、同じように苦しむ方が出ないように、簡単にではありますがまとめてみました。
参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG