React MUI の Drawer にリンクを設定し、画面遷移する機能を紹介します。ダウンロード可能なサンプルもありますので、是非活用してください。
MUI と react-router-dom を組み合わせて実現しています。
動作イメージ
初期表示状態です。アプリケーションのルートページでは、画面中央に「Top」ページが表示されています。
画面左側の Drawer メニューにある、Page1 をクリックすると、画面中央に「Page1」ページが表示されます。
注目ポイント
アプリケーションの大まかな構造は、次の様になっています。注目していただきたいポイントは、react-router-dom の BrowserRouter の中に、リンクと、リンクに対応するルーティング情報がセットで配置されているところです。これら情報を BrowserRouter の外に配置してしまうと、エラーとなってしまい、ルーティングが動作しません。
下記は、アプリケーションの構造の概略を示します。(詳細な実装コードはこの後に示します。)
<Box> <AppBar (タイトルバー)></AppBar> <BrowserRouter> <Drawer> <List> <ListItem (リンク)></ListItem> <ListItem (リンク)></ListItem> <ListItem (リンク)></ListItem> </List> </Drawer> <Box> <Routes> <Route (ルーティング情報)/> <Route (ルーティング情報)/> <Route (ルーティング情報)/> </Routes> </Box> </BrowserRouter> </Box>
実装コード
下記、MUI Drawer と react-router-dom に関連する実装コードとなります。
import React from "react"; import { Box, CssBaseline, AppBar, Toolbar, Typography, Drawer, Divider, List, ListItem, ListItemText, } from "@mui/material"; import { BrowserRouter, Routes, Route, Link } from "react-router-dom"; import Top from "./pages/Top"; import Page1 from "./pages/Page1"; import Page2 from "./pages/Page2"; const drawerWidth = 240; function App() { return ( <Box sx={{ display: "flex" }}> <CssBaseline /> <AppBar position="fixed" sx={{ width: `calc(100% - ${drawerWidth}px)`, ml: `${drawerWidth}px` }} > <Toolbar> <Typography variant="h6" noWrap component="div"> MUI Drawer + react-router-dom Demo </Typography> </Toolbar> </AppBar> <BrowserRouter> <Drawer sx={{ width: drawerWidth, flexShrink: 0, "& .MuiDrawer-paper": { width: drawerWidth, boxSizing: "border-box", }, }} variant="permanent" anchor="left" > <Toolbar /> <Divider /> <List> <ListItem button key="top" component={Link} to={"/"}> <ListItemText primary="Top" /> </ListItem> <ListItem button key="page1" component={Link} to={"/page1"}> <ListItemText primary="Page1" /> </ListItem> <ListItem button key="page2" component={Link} to={"/page2"}> <ListItemText primary="Page2" /> </ListItem> </List> </Drawer> <Box component="main" sx={{ flexGrow: 1, bgcolor: "background.default", p: 3 }} > <Toolbar /> <> <Routes> <Route index element={<Top />} /> <Route path="/" element={<Top />} /> <Route path="page1" element={<Page1 />} /> <Route path="page2" element={<Page2 />} /> </Routes> </> </Box> </BrowserRouter> </Box> ); } export default App;