Material UI와 React Router DOM으로 내비게이션 드로어 만들기
27270 단어 reactmaterialuitypescript
Drawer
을 구축했으며 이 기사의 끝에서 전체 작동 탐색 블록을 포함하게 됩니다.React 라우터 DOM 설치
football-almanac
의 루트 폴더에서 실행합니다.
npm install react-router-dom @types/react-router-dom
React Router DOM이 설치됩니다.
내비게이션 디자인
이와 같은 애플리케이션에 대해 염두에 두는 처음 세 개의 URL은 다음과 같습니다.
npm install react-router-dom @types/react-router-dom
이와 같은 애플리케이션에 대해 염두에 두는 처음 세 개의 URL은 다음과 같습니다.
/
(홈페이지)/standings
/teams
React 라우터 DOM 구현
모든 것을 포장하십시오!
시작하려면 BrowserRouter
에서 index.tsx
를 가져오고 그 안에 전체 응용 프로그램을 래핑합니다.
......
import { BrowserRouter } from 'react-router-dom';
......
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
이 시점에서 App
구성 요소가 너무 커질 것이므로 여러 구성 요소로 분할합니다. 이것은 테스트 목적으로도 좋은 수준의 격리를 보장하는 데 도움이 될 것입니다.
라우터 객체
내 경로를 이와 같은 개체로 정의하는 데 매우 유용합니다.
const Routes = [
{
path: [url],
sidebarName: [label],
icon: [material_ui_icon_name],
component: [component_name],
},
...
];
이런 식으로 라우터를 한 번 정의하고 필요할 때 모듈로 재사용할 수 있습니다.
Routes.tsx
에 내 경로를 정의합니다.
import React from 'react';
const Home: React.FC = () => {
return (
<h1>Home</h1>
);
};
const Standings: React.FC = () => {
return (
<h1>Standings</h1>
);
};
const Teams: React.FC = () => {
return (
<h1>Teams</h1>
);
};
const Routes = [
{
path: '/',
sidebarName: 'Home',
component: Home
},
{
path: '/standings',
sidebarName: 'Standings',
component: Standings
},
{
path: '/teams',
sidebarName: 'Teams',
component: Teams
},
];
export default Routes;
잠시 동안 일부 자리 표시자 구성 요소( Home
, Standings
및 Teams
)를 만듭니다.
내비게이션바
NavigationBar
라는 새 구성 요소 하위 폴더를 만듭니다. 새 구성 요소는 NavigationBar.tsx
입니다.
import React, { useState } from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import Routes from '../App/Routes';
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';
import {
AppBar,
Toolbar,
Typography,
IconButton,
Drawer,
MenuList,
MenuItem,
ListItemText,
} from '@material-ui/core';
import MenuIcon from '@material-ui/icons/Menu';
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
flexGrow: 1,
},
menuButton: {
marginRight: theme.spacing(2),
},
title: {
flexGrow: 1,
},
drawer: {
width: 300,
},
fullList: {
width: 'auto',
},
}),
);
const NavigationBar: React.FC = (props: any) => {
const classes = useStyles();
const [isOpen, setIsOpen] = useState(false);
const toggleDrawer = (open: boolean) => (
event: React.KeyboardEvent | React.MouseEvent,
) => {
if (
event.type === 'keydown' &&
((event as React.KeyboardEvent).key === 'Tab' ||
(event as React.KeyboardEvent).key === 'Shift')
) {
return;
}
setIsOpen(open);
};
const activeRoute = (routeName: any) => {
return props.location.pathname === routeName ? true : false;
}
return (
<div>
<div className={classes.root}>
<AppBar position="static">
<Toolbar>
<IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="menu" onClick={toggleDrawer(true)}>
<MenuIcon />
</IconButton>
<Typography variant="h6" className={classes.title}>
Football Almanac
</Typography>
</Toolbar>
</AppBar>
</div>
<Drawer classes={{ paper: classes.drawer }} open={isOpen} onClose={toggleDrawer(false)}>
<div
className={classes.fullList}
role="presentation"
onClick={toggleDrawer(false)}
onKeyDown={toggleDrawer(false)}
>
<MenuList>
{Routes.map((prop, key) => {
return (
<NavLink to={prop.path} style={{ textDecoration: 'none' }} key={key}>
<MenuItem selected={activeRoute(prop.path)}>
<ListItemText primary={prop.sidebarName} />
</MenuItem>
</NavLink>
);
})}
</MenuList>
</div>
</Drawer>
</div>
);
};
export default withRouter(NavigationBar);
이 구성 요소 내에서 브라우저 탐색을 사용할 수 있도록 하기 위해 React Router DOMwithRouter
과 함께 제공되는 상위 구성 요소를 사용했습니다.
It passes updated match
, location
, and history
props to the wrapped component whenever it renders.
withRender
에 대해 자세히 알아보려면 documentation 을 살펴보십시오.
App.tsx
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Routes from './Routes';
import NavigationBar from './NavigationBar/NavigationBar';
const App: React.FC = () => {
return (
<div>
<NavigationBar />
<Switch>
{Routes.map((route: any) => (
<Route exact path={route.path} key={route.path}>
<route.component />
</Route>
))}
</Switch>
</div>
);
}
export default App;
다음 스니펫을 이해하는 것이 중요합니다. 독립 모듈에서 경로를 쉽게 추가하고 제거할 수 있으므로 이를 반복하고 개체에 정의된 각 경로에 대한 경로를 만드는 것으로 충분합니다.
<Switch>
{Routes.map((route: any) => (
<Route exact path={route.path} key={route.path}>
<route.component />
</Route>
))}
</Switch>
결과는 다음과 같습니다
무엇 향후 계획
다음 단계에서는 API에서 가져온 일부 데이터를 표시할 홈 페이지를 만듭니다.
유용한 리소스
......
import { BrowserRouter } from 'react-router-dom';
......
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
const Routes = [
{
path: [url],
sidebarName: [label],
icon: [material_ui_icon_name],
component: [component_name],
},
...
];
import React from 'react';
const Home: React.FC = () => {
return (
<h1>Home</h1>
);
};
const Standings: React.FC = () => {
return (
<h1>Standings</h1>
);
};
const Teams: React.FC = () => {
return (
<h1>Teams</h1>
);
};
const Routes = [
{
path: '/',
sidebarName: 'Home',
component: Home
},
{
path: '/standings',
sidebarName: 'Standings',
component: Standings
},
{
path: '/teams',
sidebarName: 'Teams',
component: Teams
},
];
export default Routes;
import React, { useState } from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import Routes from '../App/Routes';
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';
import {
AppBar,
Toolbar,
Typography,
IconButton,
Drawer,
MenuList,
MenuItem,
ListItemText,
} from '@material-ui/core';
import MenuIcon from '@material-ui/icons/Menu';
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
flexGrow: 1,
},
menuButton: {
marginRight: theme.spacing(2),
},
title: {
flexGrow: 1,
},
drawer: {
width: 300,
},
fullList: {
width: 'auto',
},
}),
);
const NavigationBar: React.FC = (props: any) => {
const classes = useStyles();
const [isOpen, setIsOpen] = useState(false);
const toggleDrawer = (open: boolean) => (
event: React.KeyboardEvent | React.MouseEvent,
) => {
if (
event.type === 'keydown' &&
((event as React.KeyboardEvent).key === 'Tab' ||
(event as React.KeyboardEvent).key === 'Shift')
) {
return;
}
setIsOpen(open);
};
const activeRoute = (routeName: any) => {
return props.location.pathname === routeName ? true : false;
}
return (
<div>
<div className={classes.root}>
<AppBar position="static">
<Toolbar>
<IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="menu" onClick={toggleDrawer(true)}>
<MenuIcon />
</IconButton>
<Typography variant="h6" className={classes.title}>
Football Almanac
</Typography>
</Toolbar>
</AppBar>
</div>
<Drawer classes={{ paper: classes.drawer }} open={isOpen} onClose={toggleDrawer(false)}>
<div
className={classes.fullList}
role="presentation"
onClick={toggleDrawer(false)}
onKeyDown={toggleDrawer(false)}
>
<MenuList>
{Routes.map((prop, key) => {
return (
<NavLink to={prop.path} style={{ textDecoration: 'none' }} key={key}>
<MenuItem selected={activeRoute(prop.path)}>
<ListItemText primary={prop.sidebarName} />
</MenuItem>
</NavLink>
);
})}
</MenuList>
</div>
</Drawer>
</div>
);
};
export default withRouter(NavigationBar);
It passes updated match
, location
, and history
props to the wrapped component whenever it renders.
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Routes from './Routes';
import NavigationBar from './NavigationBar/NavigationBar';
const App: React.FC = () => {
return (
<div>
<NavigationBar />
<Switch>
{Routes.map((route: any) => (
<Route exact path={route.path} key={route.path}>
<route.component />
</Route>
))}
</Switch>
</div>
);
}
export default App;
<Switch>
{Routes.map((route: any) => (
<Route exact path={route.path} key={route.path}>
<route.component />
</Route>
))}
</Switch>
다음 단계에서는 API에서 가져온 일부 데이터를 표시할 홈 페이지를 만듭니다.
유용한 리소스
withRouter
https://reacttraining.com/react-router/web/api/withRouter<MenuList>
https://material-ui.com/api/menu-list/Reference
이 문제에 관하여(Material UI와 React Router DOM으로 내비게이션 드로어 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rossanodan/building-a-navigation-drawer-with-material-ui-and-react-router-dom-1j6l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)