サークルサイトを更新した際に、ReactのUIフレームワークであるMaterial-UIを使ってモバイル表示用にサイドバーをドロワー化して開閉できるようにしました。
公式サンプルは機能を十全にアピールするためにかなり複雑だったので、最低限のコードで済むようにシンプルな実装にしたものを備忘録として公開しておきます。
主な実装ファイルはこちら
React Hooksを利用して開閉状態を保持する
まずいきなりReact Hooksの知識が必要となります(Hooksについてはググってください)
const Sidebar: React.FC<HeaderProps> = ({ title }) => { const [drawerState, setDrawerState] = React.useState(false) const toggleDrawer = () => { setDrawerState(!drawerState) } //後略
公式サンプルでは4つのドロワーを一度に表示しているのでドロワーの状態を4つ配列にしていますが、今回は1つでいいのでdrawerState
を開閉状態として定義します。初期値(アクセス時)は閉じていてほしいので初期値はfalse
です。
toggleDrawer
関数はメニューボタンクリック時やドロワーを閉じる際に起動する関数で、drawerState
を切り替えるだけのものです。
ドロワー本体を実装する
<TitleGrid item sm={12} xs={12}> {/* モバイルドロワー部分開始 */} <Hidden smUp> <MenuButtonBox> <IconButton color="inherit" style={{ padding: 0 }}> <MenuOpen fontSize="large" aria-label="open drawer" onClick={toggleDrawer} /> </IconButton> </MenuButtonBox> <Drawer anchor="left" elevation={16} open={drawerState} onClose={toggleDrawer} > <DrawerGrid container onClick={toggleDrawer} onKeyDown={toggleDrawer} > <DrawerInnerGrid item alignItems="center" xs={12}> <Externals /> </DrawerInnerGrid> <DrawerInnerGrid item alignItems="center" xs={12}> <Bio /> </DrawerInnerGrid> </DrawerGrid> </Drawer> </Hidden> {/* モバイルドロワーここまで */}
モバイルアクセス時のみドロワーを使うので、ドロワー部分は<hidden>
で囲みサイズに応じた表示属性を付与しておきます。
メニューボタンのonClick
属性にtoggleDrawer
関数を起動するよう設定して、<Drawer>
のopen
にdrawerState
を指定することでdrawerState
によってドロワーの開閉が制御されるようになります。
あとはサンプルと同様にonClose
,onKeyDown
属性に状態変更の関数を指定しておくと、ドロワーのリンク以外の場所をクリックすればtoggleDrawer
が起動して状態を変更、ドロワーが閉じるようになります。
ドロワーそのもののコンポーネントは自由に指定できます。