#reactjs #react-router #material-ui #react-router-dom
#reactjs #react-router #материал-пользовательский интерфейс #react-router-dom
Вопрос:
Я видел несколько вопросов, похожих на этот, на SO, но ни один из них не соответствовал моим потребностям. Я использую React и Material-UI для создания панели мониторинга. Я использую мини-вариант Material-UI в качестве боковой панели со ссылками, которые должны отображать маршруты при нажатии. Боковую панель можно открыть, нажав кнопку, которая обновляет переменную состояния и настраивает CSS className боковой панели. Это приводит к «скольжению» боковой панели / ящика.
Если я нажму на ссылку на боковой панели, я могу легко отобразить желаемый маршрут. Однако я не могу заставить маршрут также «скользить» в сторону при открытии боковой панели / ящика. Вероятно, это будет легче понять, посмотрев на код, поэтому я включил ссылку на codesandbox ниже:
https://codesandbox.io/s/appbar-with-react-router-bkogj?file=/src/App.js
Я в основном скопировал и вставил все с веб-сайта Material-UI (я полагаю, используя v4), затем добавил маршрут самостоятельно. Был бы признателен за любые отзывы о том, как решить эту проблему.
Комментарии:
1. вы смотрели на постоянный ящик mui? mui.com/components/drawers это действительно должно дать вам все, что вам нужно 🙂
Ответ №1:
Для этого я думаю MiniDrawer
, что компоненту необходимо отображать содержимое, поскольку он обязательно знает о пространстве, которое занимают компоненты appbar и drawer.
Минидрайвер
Возьмите и отобразите children
prop.
export default function MiniDrawer({ children }) {
...
return (
<div className={classes.root}>
<CssBaseline />
<AppBar
...
>
...
</AppBar>
<Drawer
...
>
...
</Drawer>
<main className={classes.content}>{children}</main>
</div>
);
}
Приложение
Визуализируйте Outlet
как дочерний компонент.
export default function App() {
return (
<div className="App">
<AppBar>
<Outlet />
</AppBar>
</div>
);
}
Отклоняемый
Удалите лишнее поле, чтобы оно заполнило область содержимого, разрешенную родительским компонентом.
const useStyles = makeStyles((theme) => ({
content: {
flexGrow: 1,
padding: theme.spacing(3),
height: "100%",
// marginLeft: "4em" // <-- remove
}
}));