#reactjs #material-ui #react-router-dom
#reactjs #материал-пользовательский интерфейс #react-router-dom
Вопрос:
Я создал этот контент с помощью кода MaterialUI (https://material-ui.com/components/drawers /). Я также попытался изменить его для реализации некоторых маршрутизаторов. Идея в том, что некоторые кнопки на боковой панели изменят содержимое. Вот код, который я использую:
export default function Main(props) {
const { window } = props;
const classes = useStyles();
const theme = useTheme();
const [mobileOpen, setMobileOpen] = React.useState(false);
const handleDrawerToggle = () => {
setMobileOpen(!mobileOpen)
}
const drawer = (
<div>
<div className={classes.toolbar} />
<Divider />
<List>
<Link to='/'>
<ListItem button>
<ListItemIcon><HomeIcon /></ListItemIcon>
<ListItemText primary="Home" />
</ListItem>
</Link>
<ListItem button>
<ListItemIcon><GamesIcon /></ListItemIcon>
<ListItemText primary="Play Game" />
</ListItem>
<ListItem button>
<ListItemIcon><AddBoxIcon /></ListItemIcon>
<ListItemText primary="Create Game" />
</ListItem>
<Link to='/add_question'>
<ListItem button>
<ListItemIcon><AddBoxIcon /></ListItemIcon>
<ListItemText primary="Add Questions" />
</ListItem>
</Link>
<ListItem button>
<ListItemIcon><AddBoxIcon /></ListItemIcon>
<ListItemText primary="Add Question Categories" />
</ListItem>
<ListItem button>
<ListItemIcon><AddBoxIcon /></ListItemIcon>
<ListItemText primary="Add Participants" />
</ListItem>
</List>
</div>
);
const container = window !== undefined ? () => window().document.body : undefined;
return (
<Router>
<div className={classes.root}>
<CssBaseline />
<AppBar position="fixed" className={classes.appBar}>
<Toolbar>
<IconButton
color="inherit"
aria-label="open drawer"
edge="start"
onClick={handleDrawerToggle}
className={classes.menuButton}
>
<MenuIcon />
</IconButton>
<Typography variant="h3" noWrap>
Trivia Game
</Typography>
</Toolbar>
</AppBar>
<nav className={classes.drawer} aria-label="mailbox folders">
{/* The implementation can be swapped with js to avoid SEO duplication of links. */}
<Hidden smUp implementation="css">
<Drawer
container={container}
variant="temporary"
anchor={theme.direction === 'rtl' ? 'right' : 'left'}
open={mobileOpen}
onClose={handleDrawerToggle}
classes={{
paper: classes.drawerPaper,
}}
ModalProps={{
keepMounted: true, // Better open performance on mobile.
}}
>
{drawer}
</Drawer>
</Hidden>
<Hidden xsDown implementation="css">
<Drawer
classes={{
paper: classes.drawerPaper,
}}
variant="permanent"
open
>
{drawer}
</Drawer>
</Hidden>
</nav>
<main className={classes.content}>
<div className={classes.toolbar} />
<Switch>
<Route path='/'>
<CreateCategories />
</Route>
<Route path='/add_question'>
<CreateQuestions />
</Route>
</Switch>
</main>
</div>
</Router>
);
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю кнопки со ссылкой, содержимое не меняется. При загрузке содержимого отображается содержимое, на которое ссылается /
, но я не могу изменить его при нажатии кнопок. Как вы можете видеть, у меня есть две ссылки прямо сейчас, но, как я уже упоминал, они не переключаются.
Также в качестве дополнительного вопроса, могу ли я использовать эти маршрутизаторы для полной замены содержимого на странице? Все примеры, которые я видел, требуют, чтобы у вас была какая-то навигация, но что, если я захочу перейти на другую страницу с другой навигацией?
Комментарии:
1. либо оберните ваш компонент с помощью маршрутизатора hoc, либо создайте объект истории, используя перехват useHistory из пакета react-router-dom, и вместо того, чтобы использовать программную маршрутизацию link, выполните history.push(«/ yourRoute»)
Ответ №1:
Вы пробовали с
withRouter(Component);
Я исправил свою проблему с этим.
Комментарии:
1. Куда мне поместить
withRouter
? В возврате моей функции по умолчанию? Я попробовал это так, и ничего не отображается. Спасибо за ваш ответ.
Ответ №2:
вместо этого вы можете попробовать использовать встроенную перехват useHistory или history API HTML5. Это один из вариантов для вас.
history.pushState
history.replaceState
Ответ №3:
Это была проблема: способ работы маршрутизатора React заключается в том, что, когда маршруты находятся внутри коммутатора, он будет отображаться всякий раз, когда путь, который вы связываете, совпадает с маршрутом. Так, например, я хотел перейти к /add_question
, но поскольку мой первый маршрут имеет a /
, а /add_question
также имеет a /
, он немедленно соответствует ему. Есть два способа исправить это: либо вы помещаете /
маршрут последним в свой коммутатор, либо используете слово exact
в своем маршруте, чтобы /
маршрут отображался только в том случае, если путь указан точно /
.
<Switch>
<Route path='/' exact>
<CreateCategories />
</Route>
<Route path='/add_question'>
<CreateQuestions />
</Route>
</Switch>