React-router-dom
Categories
- ReactRouterDom:Navigate
Installation
You can install React Router from the public npm registry with either npm or yarn. Since we’re building a web app, we’ll use react-router-dom in this guide.
Basic Routing
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
export default function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{/* A <Switch> looks through its children <Route>s and
renders the first one that matches the current URL. */}
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/users">
<Users />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</Router>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
Drawer 스타일을 중첩 라우팅으로 해결하는 방법
import {Navigate, createBrowserRouter} from 'react-router-dom';
import App from '../App';
import Dashboard from '../pages/Dashboard';
import Discover from '../pages/Discover';
import Information from '../pages/Information';
import Live from '../pages/Live';
import Preview from '../pages/Preview';
import Statistic from '../pages/Statistic';
import MainOutlet from '../components/MainOutlet';
import WorkDrawer from '../components/WorkDrawer';
export const paths = {
root: '/',
dashboard: '/dashboard',
live: '/live',
discover: '/discover',
work: '/work',
information: '/work/information',
preview: '/work/preview',
statistic: '/work/statistic',
};
export const router = createBrowserRouter([
{
path: paths.root,
element: <App />,
children: [
{
index: true,
element: <Navigate to={paths.dashboard} replace />,
},
{
element: <MainOutlet />,
children: [
{
path: paths.dashboard,
element: <Dashboard />,
},
{
path: paths.live,
element: <Live />,
},
{
path: paths.discover,
element: <Discover />,
},
],
},
{
path: paths.work,
element: <WorkDrawer />,
children: [
{
path: paths.information,
element: <Information />,
},
{
path: paths.preview,
element: <Preview />,
},
{
path: paths.statistic,
element: <Statistic />,
},
],
},
],
},
]);
MainOutlet
import React from 'react';
import {Outlet} from 'react-router-dom';
import Box from '@mui/material/Box';
import Toolbar from '@mui/material/Toolbar';
import CssBaseline from '@mui/material/CssBaseline';
const ToolbarSpace = () => {
return <Toolbar variant="dense" />;
};
function MainOutlet() {
return (
<Box component="main" sx={{flexGrow: 1}}>
<ToolbarSpace />
<CssBaseline />
<Outlet />
</Box>
);
}
export default MainOutlet;
WorkDrawer
import React from 'react';
import {useSelector} from 'react-redux';
import {useNavigate} from 'react-router-dom';
import Avatar from '@mui/material/Avatar';
import Box from '@mui/material/Box';
import Divider from '@mui/material/Divider';
import Drawer from '@mui/material/Drawer';
import ImageIcon from '@mui/icons-material/Image';
import List from '@mui/material/List';
import ListItem from '@mui/material/ListItem';
import ListItemAvatar from '@mui/material/ListItemAvatar';
import ListItemButton from '@mui/material/ListItemButton';
import ListItemIcon from '@mui/material/ListItemIcon';
import ListItemText from '@mui/material/ListItemText';
import LocalShippingIcon from '@mui/icons-material/LocalShipping';
import ShowChartIcon from '@mui/icons-material/ShowChart';
import Toolbar from '@mui/material/Toolbar';
import MainOutlet from './MainOutlet';
import {paths} from '../routes/router';
import {selectWork} from '../stores/apis/work';
const ToolbarSpace = () => {
return <Toolbar variant="dense" />;
};
function WorkDrawer() {
const navigate = useNavigate();
const work = useSelector(selectWork);
const onInformation = () => {
navigate(paths.information);
};
const onPreview = () => {
navigate(paths.preview);
};
const onStatistic = () => {
navigate(paths.statistic);
};
const drawerWidth = 240;
return (
<React.Fragment>
<Drawer
variant="permanent"
sx={{
width: drawerWidth,
flexShrink: 0,
[`& .MuiDrawer-paper`]: {width: drawerWidth, boxSizing: 'border-box'},
}}
>
<ToolbarSpace />
<Box sx={{overflow: 'auto'}}>
<List>
<ListItem disablePadding onClick={onInformation}>
<ListItemButton>
<ListItemAvatar>
<Avatar variant="square">
<LocalShippingIcon />
</Avatar>
</ListItemAvatar>
<ListItemText
primary={work.carNumber}
primaryTypographyProps={{fontWeight: 'bold'}}
secondary={work.issueNumber}
/>
</ListItemButton>
</ListItem>
<Divider />
<ListItem disablePadding onClick={onPreview}>
<ListItemButton>
<ListItemIcon>
<ImageIcon />
</ListItemIcon>
<ListItemText primary="이벤트 영상" />
</ListItemButton>
</ListItem>
<ListItem disablePadding onClick={onStatistic}>
<ListItemButton>
<ListItemIcon>
<ShowChartIcon />
</ListItemIcon>
<ListItemText primary="통계 분석" />
</ListItemButton>
</ListItem>
</List>
</Box>
</Drawer>
<MainOutlet />
</React.Fragment>
);
}
export default WorkDrawer;